shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。
不论何时你键入一个命令,它都被Linux shell所解释。一些命令,比如打印当前工作目录命令(pwd),是包含在 Linux bash内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还是一个单独的程序。
News/ bin/ games/ mail/ samplefile test/
如果你要进入 test 子目录,你将会输入以下的命令:
cd test
这个命令能够满足你的需要,但 bash还提供了稍微不同的方法来完成同样的事。因为 test 是当前目录里唯一以字母 t开头的子目录,bash在你只输入字母 t后就能判断出你要做什么了:
cd t
在你键入那个字母后,唯一的可能就是 test 。想让 bash 帮你结束命令的话,按下 Tab 键:
cd t
当你这样做以后,bash 将帮你补齐命令并显示在屏幕上。但在你按下回车键以前命令并没有被执行,bash 会让你检验补齐的命令是否是你真正需要的。在输入象这样短的命令时你也许看不出它的价值所在,甚至在命令很短时还会简慢输入的速度,但是当你要输入的命令有点长时,你会发现这个特性是多么的美好。
但是当目录里有不止一个以字母 t 开头的文件时会发生什么情况呢?在你使用命令补齐时会有问题,让我们看看下面的情况,当前目录里有下列内容:
News/ bin/ mail/ samplefile test/ tools/ working/
现在这个目录里有两个以字母 t 开头的文件。假设你仍然想进入 test 子目录,如何使用命令补齐呢?如果你象先前那样键入:
cd t
bash 将不知道你到底想进入哪个子目录,因为给出的信息并不唯一。如果你这样做了的话,bash 将发出一声蜂鸣提醒你没有足够的信息来补齐你的命令。蜂鸣之后bash 并不改变输入的命令,这将使你能在原来的基础上再输入更多的信息,在这个例子中你仅需再键入一个 e 并再按一下 Tab 键,这时 bash 就有足够的信息来完成你的命令了:
cd test
当你输入命令时不论何时按下 Tab 键,bash 都将尽其所能地试图补齐命令,不行的话会发出蜂鸣来提醒你需要更多的信息。你需要键入更多的字符,并再次按下 Tab 键,重复这个过程直至你期望的命令出现。
通配符
另一个使命令输入变得更简单的方法是在命令中使用通配符。bash 支持三种通配符:
* 匹配任何字符和任何数目的字符
? 匹配任何单字符
[...] 匹配任何包含在括号里的单字符
* 通配符的使用有些象命令补齐。例如,假设当前目录包含以下文件:
News/ bin/ games/ mail/ samplefile test/
如果你想进入 test 目录,你将键入 cd test, 或者你想用命令补齐:
cd t
现在有第三种方法来做同样的事。因为仅有一个文件以字母 t 开头,你也能用 * 通配符来进入该目录。键入下列命令:
cd t*
* 匹配任何字符和任何数目的字符,所以 shell 将把 t* 替换为 test(当前目录里唯一和通配方案匹配的文件)。当前目录里只有一个文件以字母 t 开头的话这将是可靠的。但是如果当前目录里有不止一个文件以字母 t 开头,shell 将试着进入第一个符合匹配方案的目录,这个目录是以字母表排序的第一个目录,这个目录也许是也许不是你所期望的。
bash 把你先前输入的命令文本保存在一个历史列表中。当你用你的帐号登录后历史列表将根据一个历史文件被初始化。历史文件的文件名被一个叫 HISTFILE 的 bash变量指定。历史文件的缺省名字是 .bash_history。这个文件通常在你的用户目录中。(注意该文件的文件名以一个句号开头,这意味着它是隐含的,仅当你带 -a 或 -A参数的 ls 命令列目录时才可见)
仅将先前的命令存在历史文件里是没有用的,所以 bash 提供了几种方法来调用它们。使用历史记录列表最简单的方法是用上方向键。按下上方向键后最后键入的命令将出现在命令行上。再按一下则倒数第二条命令会出现,以此类推。如果上翻多了的话也可以用向下的方向键来下翻。(和 DOS 实用程序doskey一样)如果需要的话,显示在命令行上的历史命令可以被编辑。
另一个使用命令历史文件的方法是用 bash 的内部命令 history 和 fc(fix 命令)命令来显示和编辑历史命令。history 命令能以两种不同的方法来调用。第一种是:
history [n]
当 history 命令没有参数时,整个历史命令列表的内容将被显示出来。下面是一个命令历史列表的例子:
1 mkdir /usr/games/pool
2 cp XpoolTable-1.2.linux.tar.z /usr/games/pool
3 cd /usr/games/pool/
4 ls
5 gunzip XpoolTable-1.2.linux.tar.z
6 tar -xf XpoolTable-1.2.linux.tar
7 ls
8 cd Xpool
9 ls
10 xinit
11 exit
12 which zip
13 zip
14 more readme
15 vi readme
16 exit
使用 n 参数的作用是仅有最后 n 个历史命令会被列出。例如,history 5 显示最后 5 个命令。
调用 history 命令的第二种方法用于修改命令历史列表文件的内容。命令的语法如下:
# I had problems using 'eval test' instead of 'TERM=', but you might want to # try
it anyway. I think with the right /etc/termcap it would work great. # eval 'tset
-sQ "$TERM"'if [ "$TERM" = "" -o "$TERM" =
"unknown"]; then
TERM=linux
#PS1=''hostname':'pwd'# `
if [ "$SHELL" = "/bin/pdksh" -o "$SHELL" = "/bin/ksh" ]; then
PS1="! $"
elif [ "$SHELL" = "/bin/zsh" ]; then
PS1="%m:%~%# "
elif [ "$SHELL" = "/bin/ash" ]; then
PS1="$ "
else
PS1='\h:\w\$ `
fi
PS2='> `
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 ignoreeof
umask 022
# set up the color-ls environment variables:
if [ "$SHELL" = "/bin/zsh" l; then
eval 'dircolors -z'
elif [ "$SHELL" = "/bin/ash" l; then
eval 'dircolors -s'
else
eval 'dircolors -b'
fi
echo
fortune
echo
export TAPE="/dev/nftape"
bash 命令概要
这是几个最有用的bash内部命令:
alias: 设置bash别名。
bg: 使一个被挂起的进程在后台继续执行。
cd: 改变当前工作目录。
exit: 终止shell。
export: 使变量的值对当前shell的所有子进程都可见 。
fc: 用来编辑历史命令列表里的命令。
fg: 使一个被挂起的进程在前台继续执行。
help: 显示bash内部命令的帮助信息。
kill: 终止某个进程。
pwd: 显示当前工作目录。
unalias: 删除已定义的别名。
bash 还有许多命令,但这些是最常用的,想了解更详细的情况,请参考bash的手册--在提示符下键入 man bash。