bash shell

时间:2024-01-12 11:03:08

Linux的shell

与windows只有一种批处理脚本不同,由于早年的Unix年代,发展者众,出现了各种不同的distribution,因此也随着不同的distribution出现了各自的shell版本,常听到的就有Bourne SHell (sh) 、在 Sun 里头默认的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种shell都有其各自的特点,至于Linux使用的这一种版本就称为Bourne Again SHell (简称 bash),这个shell是Bourne SHell的增强版本,也是基于GNU的架构下发展出来的。

有哪些shell

通过查看etc/shells,可以发现至少有以下几种shell可用(笔者以centOS6.5为例)

[root@localhost ~]# ll *sh
/bin/bash
/bin/csh -> tcsh <== csh已经被 tcsh 所替代
/bin/dash
/bin/sh -> bash <== sh已经被 bash 所替代
/bin/tcsh

接着我们再看一下Linux系统默认使用哪种shell,查看/etc/passwd 文件:

[root@localhost etc]# vim passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
……

我们会发现系统默认使用使用/bin/bash 这个shell。

bash shell的功能:

  命令编修能力(history):

  简单来说,就是可以记忆使用过的命令,你可以简单的使用 ↑、↓ 键来查看使用过的命令,在很多distribution版本里,可记忆的命令能达到1000个!也就是说,你曾经下达过  的命令几乎全都被记录下来了。

  这么多的命令记录在哪里呢?在你的家目录内的 .bash_history 啦! 不过,需要留意的是,~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆  所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中!

  这有什么功能呢?最大的好处就是可以『查询曾经做过的举动!』 如此可以知道你的运行步骤,那么就可以追踪你曾下达过的命令,以作为除错的工具! 但如此一来也有个烦  恼,就是如果被黑客入侵了,那么他只要翻你曾经运行过的命令, 刚好你的命令又跟系统有关 (例如直接输入 MySQL 的密码在命令列上面),那你的主机可就伤脑筋了! 到底  记录命令的数目越多还是越少越好?这部份是见仁见智啦,没有一定的答案的。

  命令与文件补全(【tab】键的好处):

  常常在 bash 环境中使用 [tab] 是个很棒的习惯!因为至少可以让你

  1)少打很多字;

  2)确定输入的数据是正确的!

  使用 [tab] 按键的时机依据 [tab] 接在命令后或参数后而有所不同:

  • [Tab] 接在一串命令的第一个字的后面,则为命令补全;
  • [Tab] 接在一串命令的第二个字以后时,则为『文件补齐』!

  所以说,如果我想要知道我的环境中,所有可以运行的命令有几个? 就直接在 bash 的提示字符后面连续按两次 [tab] 按键就能够显示所有的可运行命令了。 那如果想要知道  系统当中所有以 c 为开头的命令呢?就按下『 c[tab][tab] 』就好啦!

  命令别名配置功能(alias):

  假如我需要知道这个目录底下的所有文件 (包含隐藏档) 及所有的文件属性,那么我就必须要下达『 ls -al 』这样的命令串,唉!真麻烦,有没有更快的取代方式?呵呵!就使  用命令别名呀!例如鸟哥最喜欢直接以 lm 这个自定义的命令来取代上面的命令,也就是说, lm 会等于 ls -al 这样的一个功能,嘿!那么要如何作呢?就使用 alias 即可!你  可以在命令列输入 alias 就可以知道目前的命令别名有哪些了!也可以直接下达命令来配置别名呦:

alias lm='ls -al'

  工作控制、前景背景控制(job control, foreground, background):

  使用前、背景的控制可以让工作进行的更顺利,至于工作控制的用途则更广,可以让我们随时随地让工作在后台运行而不中断,可以在单一的环境中达到多任务的的目的。

  程序化脚本(shell script):

  (略)

  通配符(Wildcard):

  除了完整的字符串之外, bash 还支持许多的通配符来帮助用户查询与命令下达。 举例来说,想要知道 /usr/bin 底下有多少以 X 为开头的文件吗?使用:『 ls -l   

  /usr/bin/X* 』就能够知道啰~此外,还有其他可供利用的通配符, 这些都能够加快使用者的操作呢!

Bash shell 的内建命令:type

  bash 有没有什么说明文件啊?开玩笑~ 这么棒的东西怎么可能没有说明文件!请你在 shell 的环境下,直接输入 man bash 瞧一瞧, 嘿嘿!不是盖的吧!让你看个几天几夜也无法看完的 bash 说明文件,可是很详尽的数据啊! ^_^

不过,在这个 bash 的 man page 当中,不知道你是否有察觉到,咦! 怎么这个说明文件里面有其他的文件说明啊?举例来说,那个 cd 命令的说明就在这个 man page 内? 然后我直接输入 man cd 时,怎么出现的画面中,最上方竟然出现一堆命令的介绍?这是怎么回事? 为了方便 shell 的操作,其实 bash 已经『内建』了很多命令了,例如上面提到的 cd , 还有例如 umask 等等的命令,都是内建在 bash 当中的呢!

那我怎么知道这个命令是来自于外部命令(指的是其他非 bash 所提供的命令) 或是内建在 bash 当中的呢? 嘿嘿!利用 type 这个命令来观察即可!举例来说:

[root@www ~]# type [-tpa] name
选项与参数:
:不加任何选项与参数时,type 会显示出 name 是外部命令还是 bash 内建命令
-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file :表示为外部命令;
alias :表示该命令为命令别名所配置的名称;
builtin :表示该命令为 bash 内建的命令功能;
-p :如果后面接的 name 为外部命令时,才会显示完整文件名;
-a :会由 PATH 变量定义的路径中,将所有含 name 的命令都列出来,包含 alias 范例一:查询一下 ls 这个命令是否为 bash 内建?
[root@www ~]# type ls
ls is aliased to `ls --color=tty' <==未加任何参数,列出 ls 的最主要使用情况
[root@www ~]# type -t ls
alias <==仅列出 ls 运行时的依据
[root@www ~]# type -a ls
ls is aliased to `ls --color=tty' <==最先使用 aliase
ls is /bin/ls <==还有找到外部命令在 /bin/ls 范例二:那么 cd 呢?
[root@www ~]# type cd
cd is a shell builtin <==看到了吗? cd 是 shell 内建命令

透过 type 这个命令我们可以知道每个命令是否为 bash 的内建命令。 此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以运行档的状态被找到, 那么该名称是不会被显示出来的。也就是说, type 主要在找出『运行档』而不是一般文件档名喔! 呵呵!所以,这个 type 也可以用来作为类似 which 命令的用途啦!找命令用的!

命令的下达

  命令的下达通过回车进行就不再赘述,这里仅就反斜杠 (\) 来说明一下命令下达的方式!

范例:如果命令串太长的话,如何使用两行来输出?
[vbird@www ~]# cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root

上面这个命令用途是将三个文件复制到 /root 这个目录下而已。不过,因为命令太长, 于是就利用『 \[Enter] 』来将 [Enter] 这个按键『跳脱!』开来,让 [Enter] 按键不再具有『开始运行』的功能!好让命令可以继续在下一行输入。 需要特别留意, [Enter] 按键是紧接着反斜杠 (\) 的,两者中间没有其他字符。 因为 \ 仅跳脱『紧接着的下一个字符』而已!所以,万一我写成: 『 \ [Enter] 』,亦即 [Enter] 与反斜杠中间有一个空格时,则 \ 跳脱的是『空格键』而不是 [Enter] 按键!这个地方请再仔细的看一遍!很重要!

如果顺利跳脱 [Enter] 后,下一行最前面就会主动出现 > 的符号, 你可以继续输入命令啰!也就是说,那个 > 是系统自动出现的,你不需要输入。

总之,当我们顺利的在终端机上面登陆后, Linux 就会依据 /etc/passwd 文件的配置给我们一个 shell (默认是 bash),然后我们就可以依据上面的命令下达方式来操作 shell, 之后,我们就可以透过 man 这个在线查询来查询命令的使用方式与参数说明, 很不错吧!那么我们就赶紧更进一步来操作 bash 这个好玩的东西啰!