我正在运行一个 Ubuntu 发行版,其中/bin/sh
有一个指向 的符号链接/bin/dash
。虽然这对我的大多数用户来说都没问题,但其中肯定有一个用户bin/sh
“符号链接”到了/bin/bash
。
这可能吗?我不确定该怎么做。
问候。
答案1
[…] 其中一个必须已
/bin/sh
符号链接到/bin/bash
。
我怀疑实际情况是:
[…] 他们中的一个编写了一些带有 Bashisms 的糟糕的 shell 脚本,并且不想修复 xyr 糟糕的脚本。
显然,您无法为每个用户创建符号链接。因此,请让您的用户将这些 Bashisms 从用作/bin/sh
解释器的任何 shell 脚本中移除,并将其放入/bin/bash
(或 piernov 提到的替代方案)任何真正应该将 Bourne Again shell 用作脚本解释器的 shell 脚本中。
如果这些脚本假设这sh
只是 Bourne Again shell,或者它们依赖于 Bashisms,而实际上并没有以 as 调用 Bourne Again shell (如果想要相当数量的 Bashisms,bash
即使以 as 调用也是错误的),那么sh
破碎的并应予以修补。
进一步阅读
- https://superuser.com/a/696310/38062
- 破折号
/bin/sh
。 Ubuntu 维基。 - 破折号
/bin/sh
.Debian 维基。 - 巴什主义. Greg 的维基。
- Shell 命令语言. IEEE Std 1003.1。第 7 期。开放群组。
答案2
/bin/sh
只是一个 Bourne shell。dash 和 bash 都可以充当与 sh 兼容的 shell,而且由于原始的 Bourne shell 不再使用,sh 通常是 bash 或 dash(主要在 Ubuntu 上)的符号链接,甚至是 zsh。
但是,使用 sh 时,您不应使用特定 shell 的任何特性。这就是为什么带有#!/bin/sh
shebang 的脚本不应依赖任何 bashism 的原因。当它使用 bash 的任何特性时,它应该使用#!/usr/bin/env bash
。这是用于运行脚本的 shell。
shell 的另一个方面是用户使用的命令提示符。大多数情况下,它定义在 中/etc/passwd
,具体选择取决于您使用的发行版。如果默认使用破折号,您显然可以/etc/passwd
为特定用户更改 中的行并输入/usr/bin/bash
。
最后,即使这不是一个好主意,如果您确实希望sh
运行该命令bash
,如果它在 shell 中,您应该能够运行alias
它,或者在另一个目录中创建指向它的符号链接(~/bin
例如),然后将其添加到 PATH()的前面export PATH="~/bin:${PATH}"
。