深入了解常见Shell:下载、版本与初始化
1. 常见Shell的下载与编译
在日常使用中,我们经常会用到不同的Shell,如bash和ksh93。以下将详细介绍它们的下载和编译过程。
1.1 bash的下载与编译
bash可以从自由软件基金会GNU项目的FTP服务器获取。当前版本为3.0,你可以使用
wget
命令来下载发行版的tar文件:
$ wget ftp://ftp.gnu.org/gnu/bash/bash-3.0.tar.gz
也可以使用传统的匿名FTP方式:
$ ftp ftp.gnu.org
Name (ftp.gnu.org:tolstoy): anonymous
ftp> cd /gnu/bash
ftp> binary
ftp> hash
ftp> get bash-3.0.tar.gz
ftp> quit
除了bash发行版本身,还需要获取补丁。对于bash 3.0版本,补丁需从
ftp://ftp.cwru.edu/pub/bash/bash-3.0-patches/
下载:
$ mkdir /tmp/p
$ cd /tmp/p
$ for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
> do wget ftp://ftp.cwru.edu/pub/bash/bash-3.0-patches/bash30-0$i
> done
接下来,解压发行版并应用补丁:
$ gzip -d < bash-3.0.tar.gz | tar -xpvzf -
$ cd bash-3.0
$ for i in /tmp/p/*
> do patch -p0 --verbose --backup < $i
> done
$ find . -name '*.rej'
$ find . -name '*.orig' -print | xargs rm
最后,按照标准的GNU流程编译和安装bash:
$ ./configure && make && make check
$ make install
1.2 ksh93的下载与编译
ksh93可以从AT&T研究网站以源代码形式下载,网址为
http://www.research.att.com/sw/download
。以下是编译ksh93p(2004年2月版本)的步骤:
1. 从网站下载
INIT.2004-02-29.tgz
和
ast-ksh.2004-02-29.tgz
,并将它们放在一个空目录中。
2. 创建目录
lib/package/tgz
并将两个文件移动到该目录:
$ mkdir -p lib/package/tgz
$ mv *.tgz lib/package/tgz
- 手动解压INIT包:
$ gzip -d < lib/package/tgz/INIT.2004-02-29.tgz | tar -xvf -
- 使用AT&T工具开始构建过程:
$ bin/package read
- 开始编译:
$ bin/package make
-
新编译的ksh93二进制文件位于
arch/ARCH/bin/ksh,对于x86 GNU/Linux系统,ARCH为linux.i386:
$ arch/linux.i386/bin/ksh
$ echo ${.sh.version}
- 可以将新编译的Korn Shell移动到路径中的目录,如个人的bin目录:
$ cp arch/linux.i386/bin/ksh $HOME/bin/ksh93
2. 其他扩展Bourne风格的Shell
除了bash和ksh93,还有另外两种流行的Shell值得关注。
| Shell名称 | 特点 | 主页 |
|---|---|---|
| Public Domain Korn Shell(pdksh) | 基于Charles Forsyth的公共领域的Version 7 Bourne shell克隆版本,与1988 Korn shell和POSIX大多兼容,有自己独特的扩展 | http://web.cs.mun.ca/~michael/pdksh/ |
| Z-Shell(zsh) | 强大的交互式Shell和脚本语言,具有ksh、bash和tcsh的许多功能以及一些独特功能,具有ksh88的大部分功能,但ksh93的功能较少 | http://www.zsh.org/ |
3. 查看Shell版本
有时我们需要查看不同Shell的版本号,以下是查看方法:
$ bash --version
$ ksh --version
$ ksh
$ ^V
$ echo 'echo $KSH_VERSION' | pdksh
$ echo 'echo $ZSH_VERSION' | zsh
对于
/bin/sh
,似乎没有办法获取其版本号。因为大多数商业Unix系统上的真正Bourne shell源自System V Release 3(1987)或Release 4(1989)的Bourne shell,自那时以来几乎没有变化。
4. Shell的登录与非登录判断
Shell的行为取决于它是否是登录Shell。当你在终端输入用户名和密码登录,或者使用
ssh hostname
时,会得到一个登录Shell。而通过名称运行Shell、作为脚本中的命令解释器隐式运行、创建新的工作站终端窗口或在远程Shell中运行命令时,得到的是非登录Shell。
判断是否为登录Shell可以通过查看
$0
的值,如果以连字符开头,则为登录Shell,否则不是:
$ echo $0
mermaid格式流程图如下:
graph LR
A[启动Shell] --> B{是否为登录Shell}
B -- 是 --> C[执行登录Shell操作]
B -- 否 --> D[执行非登录Shell操作]
5. 不同Shell的初始化与终止
不同的Shell在启动和终止时会读取不同的文件,以下是几种常见Shell的情况。
5.1 Bourne Shell(sh)
-
启动
:作为登录Shell启动时,尝试读取
/etc/profile和$HOME/.profile:
test -r /etc/profile && . /etc/profile
test -r $HOME/.profile && . $HOME/.profile
作为非登录Shell时,不会自动读取启动文件。
-
终止
:默认不读取标准终止文件,但可以设置陷阱来实现:
trap '. $HOME/.logout' EXIT
5.2 Korn Shell(ksh)
-
启动
:作为登录Shell启动时,读取
/etc/profile和$HOME/.profile。作为交互式Shell(登录或非登录)启动时,ksh93会尝试读取$ENV文件,ksh88则无条件处理$ENV文件:
test -n "$ENV" && eval . "$ENV"
- 终止 :非交互式的ksh93不会读取启动或终止脚本,除非设置了合适的陷阱。
5.3 Bourne-Again Shell(bash)
-
启动
:作为登录Shell启动时,尝试读取
/etc/profile,然后按顺序尝试读取$HOME/.bash_profile、$HOME/.bash_login和$HOME/.profile:
test -r /etc/profile && . /etc/profile
if test -r $HOME/.bash_profile ; then
. $HOME/.bash_profile
elif test -r $HOME/.bash_login ; then
. $HOME/.bash_login
elif test -r $HOME/.profile ; then
. $HOME/.profile
fi
作为交互式非登录Shell启动时,尝试读取
$HOME/.bashrc
。作为非交互式Shell时,读取
BASH_ENV
变量指定的文件:
test -r "$BASH_ENV" && eval . "$BASH_ENV"
-
终止
:登录Shell退出时,尝试读取
$HOME/.bash_logout:
test -r $HOME/.bash_logout && . $HOME/.bash_logout
总结不同Shell启动和终止时读取文件的情况如下表:
| Shell | 登录Shell启动 | 非登录交互式Shell启动 | 非交互式Shell启动 | 登录Shell终止 |
| ---- | ---- | ---- | ---- | ---- |
| Bourne Shell(sh) |
/etc/profile
、
$HOME/.profile
| 无 | 无 | 可设置陷阱读取
$HOME/.logout
|
| Korn Shell(ksh) |
/etc/profile
、
$HOME/.profile
| ksh93:
$ENV
;ksh88:无条件处理
$ENV
| 无(可设置陷阱) | 无(可设置陷阱) |
| Bourne-Again Shell(bash) |
/etc/profile
、
$HOME/.bash_profile
或
$HOME/.bash_login
或
$HOME/.profile
|
$HOME/.bashrc
|
BASH_ENV
|
$HOME/.bash_logout
|
mermaid格式流程图如下:
graph LR
A[Bash启动] --> B{是否为登录Shell}
B -- 是 --> C[/etc/profile] --> D{$HOME/.bash_profile?}
D -- 是 --> E[$HOME/.bash_profile]
D -- 否 --> F{$HOME/.bash_login?}
F -- 是 --> G[$HOME/.bash_login]
F -- 否 --> H[$HOME/.profile]
B -- 否 --> I{是否为交互式Shell}
I -- 是 --> J[$HOME/.bashrc]
I -- 否 --> K[$BASH_ENV]
A1[Bash退出] --> L{是否为登录Shell}
L -- 是 --> M[$HOME/.bash_logout]
L -- 否 --> N[无]
通过以上内容,我们对常见Shell的下载、版本查看以及初始化和终止过程有了更深入的了解。在实际使用中,根据不同的需求选择合适的Shell,并合理配置其启动和终止文件,能够提高工作效率。
深入了解常见Shell:下载、版本与初始化
6. 不同Shell初始化和终止的影响及应对策略
不同Shell在初始化和终止方面的差异,会对我们的使用产生不同的影响,下面来详细分析并给出应对策略。
6.1 对脚本执行的影响
-
Bourne Shell(sh)
:由于非登录Shell不自动读取启动文件,远程命令执行时
PATH可能不是我们习惯的值,在编写脚本时需要手动设置环境变量。例如在“Automating Software Builds”的build - all脚本中,就需要处理这种情况。 - Korn Shell(ksh) :ksh93非交互式Shell不读取启动脚本,对于依赖启动文件配置的脚本,需要在脚本中手动加载相关配置。
-
Bourne - Again Shell(bash)
:虽然bash在不同模式下有不同的启动文件读取规则,但如果脚本是在非预期的模式下运行,可能会导致某些初始化配置缺失。比如在非登录非交互式模式下,可能不会加载
$HOME/.bashrc中的配置。
6.2 应对策略
- 统一环境配置 :在编写脚本时,尽量在脚本内部设置所需的环境变量和配置,不依赖Shell的自动初始化。例如:
#!/bin/sh
PATH=/usr/local/bin:$PATH
export PATH
# 其他脚本逻辑
-
使用通用配置文件
:可以编写一个通用的配置文件,然后在不同Shell的启动文件中引用。例如,创建一个
$HOME/.common_profile文件,在$HOME/.bash_profile、$HOME/.profile等文件中添加如下内容:
test -r $HOME/.common_profile && . $HOME/.common_profile
7. 不同Shell的优势与适用场景
不同的Shell具有不同的特点和优势,适用于不同的场景,以下是详细介绍。
| Shell名称 | 优势 | 适用场景 |
|---|---|---|
| Bourne Shell(sh) | 是便携式Shell脚本期望的Shell,在大多数商业Unix系统中作为系统管理账户的选择,简单稳定 | 编写需要在多种Unix系统上通用的脚本,系统管理的简短交互会话 |
| Korn Shell(ksh) |
具有
ENV
变量,可解决子Shell会话设置私有别名的问题,功能较为强大
| 需要在交互式和脚本编写中使用高级功能,对兼容性有一定要求 |
| Bourne - Again Shell(bash) | 功能丰富,有完善的启动和终止文件读取机制,在GNU/Linux系统中广泛使用 | 日常的交互式使用,在GNU/Linux环境下开发脚本 |
| Public Domain Korn Shell(pdksh) | 与1988 Korn shell和POSIX大多兼容,有自己的扩展 | 对Korn shell兼容性有要求,需要一些扩展功能的场景 |
| Z - Shell(zsh) | 具有许多独特功能,如强大的交互式功能和脚本语言特性 | 喜欢探索新功能,对交互式体验有较高要求的用户 |
8. 总结与建议
通过对常见Shell的下载、版本查看、初始化和终止过程以及不同Shell特点的学习,我们可以根据自己的需求做出合理的选择。
- 对于新手 :如果是刚开始接触Unix/Linux系统,建议从bash入手,因为它在GNU/Linux系统中广泛使用,功能丰富且文档资料较多,容易上手。
- 对于脚本开发者 :如果需要编写跨平台的便携式脚本,优先考虑使用Bourne Shell(sh);如果需要使用高级功能和特性,可以选择Korn Shell(ksh)或Z - Shell(zsh)。
- 对于系统管理员 :在进行系统管理的简短交互会话时,可以使用Bourne Shell(sh);在日常的交互式使用中,bash是一个不错的选择。
同时,在使用不同Shell时,要注意其初始化和终止的规则,合理配置启动和终止文件,避免因环境配置问题导致的错误。在编写脚本时,尽量使脚本具有独立性,减少对Shell自动初始化的依赖。
mermaid格式流程图如下:
graph LR
A[选择Shell] --> B{新手用户?}
B -- 是 --> C[使用bash]
B -- 否 --> D{脚本开发者?}
D -- 是 --> E{跨平台脚本?}
E -- 是 --> F[使用Bourne Shell(sh)]
E -- 否 --> G{需要高级功能?}
G -- 是 --> H[使用Korn Shell(ksh)或Z - Shell(zsh)]
G -- 否 --> I[根据习惯选择]
D -- 否 --> J{系统管理员?}
J -- 是 --> K{简短交互会话?}
K -- 是 --> F
K -- 否 --> C
J -- 否 --> I
总之,深入了解不同Shell的特点和使用方法,能够让我们在Unix/Linux系统中更加高效地工作和开发。
超级会员免费看
1635

被折叠的 条评论
为什么被折叠?



