bash shell
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 这个好玩的东西啰!