为什么同时有/sbin/sh和/bin/sh

本文探讨了系统中两种不同类型的Shell:/sbin/sh(静态链接)与/bin/sh(动态链接)。重点介绍了它们之间的区别,静态链接Shell的优势在于即使系统环境出现问题也能独立运行,因此更适合用于关键任务如root用户的默认Shell。

Both /sbin/sh and /usr/bin/sh shells are Bourne shells.
The difference is that /sbin/sh is statically linked and /usr/bin/sh is
dynamically linked.  There is also /bin/sh, however /bin is just a symbolic
link to /usr/bin.

# ls -l /sbin/sh
-r-xr-xr-x   2 bin      root      251712 Jul 16  1997 /sbin/sh

# file /sbin/sh
/sbin/sh:       ELF 32-bit MSB executable SPARC Version 1, statically linked, stripped

# ldd /sbin/sh
ldd: /sbin/sh: file is not a dynamic executable or shared object


# ls -l /usr/bin/sh
-r-xr-xr-x   3 bin      root       88620 Jul 16  1997 /usr/bin/sh

# file /usr/bin/sh
/usr/bin/sh:    ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped

# ldd /usr/bin/sh
       libc.so.1 =>;     /usr/lib/libc.so.1
       libdl.so.1 =>;    /usr/lib/libdl.so.1

Dynamically linked binaries use shared libraries during their execution.  This
makes them smaller in size and when libraries get updated, the binaries will
automatically use the updated libraries.

Statically linked binaries contain all the code within them.  They do not
use shared libraries at all.  This makes them larger in size.  The useful thing
about statically linked binaries is that they can run all by themselves as
they do not depend on shared libraries.  If the system is "broken" and libraries
were removed, damaged, or /usr is not mounted, /sbin/sh can still be executed.

This is why it is recommended to use /sbin/sh as the default root shell.

大体意思就是/sbin/sh 是静态链接的, /bin/sh是动态链接的。 静态链接的sh虽然比动态链接的size大,但它有个好处就是它的运行不依赖共享库。也就是说如果系统崩溃导致库文件丢失或损坏,它仍然能执行。
最后一句: 这就是我们推荐用/sbin/sh作为root的默认shell的原因。

转载于:https://www.cnblogs.com/papam/articles/1546048.html

<think>我们正在讨论Shell脚本中PATH变量赋值的语法。用户特别询问了`PATH=${PATH:-/sbin:/bin:/usr/sbin:/usr/bin:/etc}`中`-`符号的含义。 根据引用[2]中的说明,PATH变量被设置为一系列目录路径,用冒号分隔。在Shell脚本中,`${var:-default}`是一种参数扩展语法。它的含义是:如果变量`var`未设置或为空,则使用`default`值;否则使用`var`的值。 因此,在表达式`PATH=${PATH:-/sbin:/bin:/usr/sbin:/usr/bin:/etc}`中: - 如果`PATH`变量已经设置且非空,则使用现有的`PATH`值。 - 如果`PATH`未设置或为空,则使用默认值`/sbin:/bin:/usr/sbin:/usr/bin:/etc`。 这种语法常用于确保变量有一个合理的默认值,避免因变量未设置而导致的错误。 在用户提供的脚本中,开头的部分: ```bash case $PATH in "") PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc export PATH ;; esac ``` 这个case语句检查`PATH`是否为空字符串,如果是,则设置默认路径并导出。而使用`PATH=${PATH:-...}`可以更简洁地达到同样的效果。 因此,我们可以将原脚本中的case语句替换为: ```bash PATH=${PATH:-/sbin:/bin:/usr/sbin:/usr/bin:/etc} export PATH ``` 这样,如果PATH为空或未设置,就使用指定的默认值;否则保留原值。然后导出PATH变量。 现在,我们使用数学表达式来说明这个结构: 设$V$为变量`PATH`的值,$D$为默认值(即`/sbin:/bin:/usr/sbin:/usr/bin:/etc`),则: $$ \text{PATH} = \begin{cases} V & \text{if } V \neq \emptyset \\ D & \text{otherwise} \end{cases} $$ 这里,$\emptyset$表示空值。 这种语法在Shell脚本中非常常见,用于提供默认值,避免变量未设置时出错。 §§ 相关问题 §§ 1. Shell脚本中还有哪些类似的参数扩展语法? 2. 如何在不改变现有PATH的情况下添加新路径? 3. 为什么在脚本中需要设置PATH变量? 4. 如何检查一个环境变量是否已设置?</think>### Shell脚本中PATH变量赋值的语法解析 在Shell脚本中,`PATH=${PATH:-/sbin:/bin:/usr/sbin:/usr/bin:/etc}` 这种语法使用了**参数扩展**功能,其中`-`符号是参数扩展操作符的关键部分。具体含义如下: #### 语法解析 `${变量名:-默认值}` 表示: 1. 如果 `变量名` 已设置且非空 → 使用该变量的值 2. 如果 `变量名` 未设置或为空 → 使用 `默认值` 在数学上可表示为: $$ \text{PATH} = \begin{cases} \text{原PATH值} & \text{if } \text{PATH} \neq \emptyset \\ \text{默认路径} & \text{otherwise} \end{cases} $$ #### 实际应用 ```bash PATH=${PATH:-/sbin:/bin:/usr/sbin:/usr/bin:/etc} ``` 等价于: ```bash if [ -z "$PATH" ]; then PATH="/sbin:/bin:/usr/sbin:/usr/bin:/etc" fi ``` #### 对比原始脚本 原脚本中使用的是: ```bash case $PATH in "") PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc export PATH ;; esac ``` 使用参数扩展语法更简洁高效: ```bash PATH=${PATH:-/sbin:/bin:/usr/sbin:/usr/bin:/etc} export PATH ``` #### 参数扩展的常见变体 | 语法 | 含义 | |------|------| | `${var:-default}` | var未设置/空时用default | | `${var:=default}` | var未设置/空时赋值default | | `${var:?message}` | var未设置/空时报错退出 | | `${var:+replacement}` | var已设置时用replacement | 例如引用[2]中的: ```bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH ``` 这是直接赋值,没有使用默认值逻辑[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值