Unix & Linux大学教程(二):Shell、重定向和管道
第11章 shell
Shell两大家族:Bourne shell家族(Bourne Shell、bash、FreeBSD、Korn Shell、Pdksh、Zsh)和C-Shell家族(C-Shell、Tcsh)。
临时改变shell只需要直接在命令行输入shell名称运行shell,按^D可终止,回到最初shell;查看/etc/shells文件可知道系统安装了哪些shell。
改变登录shell使用chsh(change shell),其语法为:chsh [-s shell] [userid]
其中userid是希望改变shell的用户标识,shell是新登录shell的路径名。改变登录shell时,修改的是/etc/shell文件,因此要等下一次登录系统时才能生效。
第12章 使用shell:变量和选项
环境变量是全局变量(严格上讲不完全是全局的,子进程对环境变量的修改不会传递到父进程),shell变量是局部变量,要局部变量同时变为环境变量使用export命令。
查看环境变量用命令env或printenv,查看shell变量用set命令。
set命令可以用来定制shell环境,使用选项“o”来打开或者关闭选项。例如打开选项:set -o 选项,关闭选项目:set +o 选项。(对C-shell,则是set和unset命令)
第13章 使用shell:命令和定制
使用反斜线引用单个字符,使用单引号引用(强引用)一串字符,使用双引号引用(弱引用)一串字符但保留$(美元)、`(反引号)和\(反斜线)的特殊含义。
Bash和Tcsh允许使用特殊码来增强shell提示,其中Bash使用\作为转义字符,Tcsh使用%作为转义字符,例如,Bash中部分特殊码如下:
\w(工作目录)、\h(主机名)、\u(用户标识)、\@(时间:AM/PM表示法) 。
可以将命令封装在反引号中,嵌入其他命令中,例如: echo "The time and date are `date` "。
Bash可以使用^R(重新调用),例如,调用最近的一条ls命令,可以按下^R,然后键入ls。
unalias移除别名,加反斜杠使用原始命令而不使用别名,如\ls使用原始ls。
fc命令可以显示历史命令,并可以修改命令并重新执行,例如:fc -s ls=rm 将上一条命令的ls修改为rm然后执行。
表示法cd \!* 指在原始命令行上键入的任何参数。
第14章 使用shell:初始化文件
登录文件(.bash_profile、.cash_login)、环境文件(.bashrc)、注销文件(.bash_logout)(这里以bash为例,不同shell命名不同)。
名称以点号开头的文件称为点文件或隐藏文件;环境文件名都以rc结尾,rc代表run commands。
登录shell执行登录文件和环境文件(不同shell执行顺序不同),非登录shell只执行环境文件。变量ENV用于指定环境文件。
第15章 标准I/O:重定向和管道
防止文件被重定向替换或创建,可以设置noclobber变量。设置后,仍要替换或创建,则要使用>|(C-shell用>!)和>>!(bash)。
Unix提供了两种使用子shell 的方法,一种是输入命令启动全新的shell,一种是将命令括在圆括号中。第二种一种常见的应用为:
(cd …;command) 这样在运行后仍回到原工作目录,这种位于圆括号内的命令有时候也被称为一个编组(grouping)。
对C-Shell,重定向标准错误用>&而不是2>,并且>&重定向标准输出和标准错误,无法单独重定向标准错误,要单独重定向标准错误的一个方法如下:
(sort > output) >& errors 即在子shell中,标准输出被重定向到了output,剩下的输出(标准错误)被重定向到另一个文件errors。
bash可以使用>&或者&>同时重定向标准输出和标准错误,但要追加而不替换,则要使用: sort >> output 2>&1 。
管道—— 一个程序的标准输出作为下一个程序的标准输入。B-shell家族可以使用 2>&1 | 将标准输出和标准错误一块发给下一个程序。