Linux 版 (精华区)
作 家: Beth (打网球去!) on board 'unix'
题 目: FAQ5
来 源: 哈尔滨紫丁香站
日 期: Sat Apr 12 08:45:30 1997
出 处: qlu@hitcrc.hitcrc.hit.edu.cn
发信人: Only (在水一方), 信区: Unix
标 题: Unix Chinese FAQ(5) (fwd)
发信站: 饮水思源 (Sun Nov 17 10:53:47 1996)
本篇文章回答以下问题:
5.1) shell 要如何分类呢?
5.2) 在一个 shell script 里面要如 "include" 另一个 shell script 呢?
5.3) 是不是所有 shell 都有 alias,有没别的替代方案呢?
5.4) 要如何设定 shell 的变数呢?
5.5) 要如何得知是否是在一 interactive shell 中?
5.6) 那些以 "." 开始其档名的档案在各种 shell 中的用途为何?
5.7) 我想要知道更多各种 shell 的相异之处。请指点明路。
5.1) shell 要如何分类呢?
一般来说,shell 可以分成两类。第一类是由 Bourne shell 衍生出来的包括
sh,ksh,bash,与 zsh。第二类是由 C shell 衍生出来的,包括 csh 与
tcsh。除此之外还有一个 rc,有人认为该自成一类,有人认为该归类在
Bourne shell。
把上面的分类法记住,就可以写出所有 Bourne shell类的 shell 或是所有 C
shell 类的 shell 都可用的 script。
5.2) 在一个 shell script 里面要如何 "include" 另一个 shell script 呢?
由 Bourne shell 衍生者(包括 rc)用 "." 这个指令。由 C shell 衍生者则使
用 "source"。
5.3) 是不是所有 shell 都有 alias,有没别的替代方案呢?
除了 sh 外,主要的 shell 都有 alias,不过用法不大一样。例如有些 alias
不接受参数。
Bourne shell 类中 shell function 虽然严格说来不是 alias,不过也差不多了。
Shell function 还可以做到一些 alias 所做不到的事情。从 Version 7 Unix
的衍生出来的系统(包括 System III 与 4.2BSD) 里面的 Bourne shell 没有
shell function。System V 与 4.3BSD 的 sh 都有 shell function。
用 unalias 来去除 alias, 用 unset 来去除 shell function。
5.4) 要如何设定 shell 的变数呢?
在 C shell 类的 shell 中用 "set variable=value" 来设定只给这个 shell
看的变数,用 "setenv variable value" 来设定环境变数。要去除变数则以
unset 与 unsetenv 为之。在 Bourne shell 类的 shell 中则用
"variable=value" 来设定变数,若要将一变数并成环境变数则用 "export
VARIABLE_NAME"。要去除一个变数则用 unset。
5.5) 要如何得知是否是在一 interactive shell 中?
在 C shell 类中,看看 $prompt 这个变数便知分晓。
在 Bourne shell 类中,可以看 $PS1 这个变数,不过最好是检查 $- 这个变
数。假如 $- 里有 i,那就表示是在 interactive shell 中。作法如下:
case $- in
*i*) # do things for interactive shell
;;
*) # do things for non-interactive shell
;;
esac
5.6) 那些以 "." 开始其档名的档案在各种 shell 中的用途为何?
下面的说明或许不尽完整,但应该讲的都讲了。
csh
有一些版本在系统中所有使用者都必须读取的 .cshrc 与 .login。不
过,每一个版本放置这些档案的地方不大相同。
启动 (依照所列顺序):
.cshrc - 每次都会读取
.login - login shell 才会读取
结束之前:
.logout - login shells.
其他:
.history - 储存history (根据 $savehist 的值决定大小).
tcsh
启动 (依照所列顺序):
/etc/csh.cshrc - 每次都会读取
/etc/csh.login - login shells 才会读取
.tcshrc - 每次都会读取
.cshrc - 假如没有 .tcshrc 在的话
.login - login shells 才会读取
结束之前:
.logout - login shells 才会读取.
其他:
.history - saves the history (based on $savehist).
.cshdirs - saves the directory stack.
sh
启动 (依照所列顺序):
/etc/profile - login shell 才会读取
.profile - login shell 才会读取
结束之前:
any command (or script) specified using the command:
trap "command" 0
ksh
启动 (依照所列顺序):
/etc/profile - login shells 才会读取
.profile - login shells 才会读取
$ENV - always, if it is set.
结束之前:
如果你用了 trap "command" 0,则结束之际会执行 "command" (
bash
启动 (依照所列顺序):
/etc/profile - login shell 才会读取
.bash_profile - login shell 才会读取
.profile - 如果没有 .bash_profile,则会在 login 时读取
.bashrc - interactive non-login shell 才会读取
$ENV - 若有设定则读取之
结束之前:
.bash_logout - login shell 读取之
其他:
.inputrc - Readline 初始化之时
zsh
启动 (依照所列顺序):
.zshenv - 若无 -f 就会读取
.zprofile - login shell 呕岫寥
.zshrc - interactive shell 若无 -f 就会读取
.zlogin - login shell 结束之前
结束之前:
.zlogout - login shell 才会读取
rc
启动 (依照所列顺序):
.rcrc - login shell 才会读取
5.7) 我想要知道更多各种 shell 的相异之处。请指点明路。
你可以用 anonymous ftp 在下列地点取得一份有关 sh、tcsh、ksh、
bash、zsh 与 rc 的详细比较。
cs.uwp.edu (131.210.1.4):pub/vi/docs/shell-101.BetaA.Z
utsun.s.u-tokyo.ac.jp:misc/vi-archive/docs/shell-101.BetaA.Z
这个档案中比较了呼叫 shell 时的旗号、程式的文法、输出/入之转向、与环
境变数。不过这个档案并不讨论以 "." 为档名开头的档案以及环境变数与
函数的继承。
--
※ 来源:.饮水思源 bbs.sjtu.edu.cn.[FROM: 202.112.26.40]
--
※ 来源:·哈尔滨紫丁香站 bbs1.hit.edu.cn·[FROM: qlu@hitcrc.hitcrc.hi]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.536毫秒