40、深入了解常见Shell:下载、版本与初始化

深入了解常见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
  1. 手动解压INIT包:
$ gzip -d < lib/package/tgz/INIT.2004-02-29.tgz | tar -xvf -
  1. 使用AT&T工具开始构建过程:
$ bin/package read
  1. 开始编译:
$ bin/package make
  1. 新编译的ksh93二进制文件位于 arch/ARCH/bin/ksh ,对于x86 GNU/Linux系统,ARCH为 linux.i386
$ arch/linux.i386/bin/ksh
$ echo ${.sh.version}
  1. 可以将新编译的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系统中更加高效地工作和开发。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值