“ sh”是否必须在“ / bin”目录中?


16

我已经阅读过POSIX兼容的操作系统(例如:Linux)必须具有sh外壳程序。

但是它是否sh必须位于/bin目录中,或者可以位于任何目录中?


您可以始终使用符号链接,因为/bin/sh在大多数情况下,在Linux上,它已经是的符号链接bash。只是很多脚本都使用了硬编码/bin/sh
cylgalad 18'Jan

5
既然您已经知道它可以放置在所需的任何位置,那么您可能会问自己:您如何才能随便写一个shebang行sh?答案是:shebang也不是POSIX的一部分,因此问题甚至没有出现。
约尔格W¯¯米塔格

1
@JörgWMittag是的,有时令人惊讶的是,POSIX实际上并不需要我们认为有多少东西是“标准” Unix功能。
Barmar

1
是否使用shebang取决于路径是否/bin/sh必须在POSIX系统上存在。
chepner

至少在Ubuntu衍生的系统上,/bin/sh是的链接dash。在BSD上,/bin/sh它不是链接,而是单独的可执行文件,当然也不是bash
Rhialto支持Monica

Answers:


22

POSIX只强制要求/dev/tmp目录的存在,以及/dev/null/dev/tty/dev/console文件。标准实用程序必须存在,但未指定特定位置。可能根本不存在/bin,如果存在可能不包含sh,并且如果不存在则可能不是POSIX sh

您可以使用以下命令获取PATH包含POSIX工具(包括)的有效变量:shgetconf

$ PATH=$(getconf PATH)
$ sh

例如,这在Solaris上很有用,因为Solaris 的默认shsh设置与POSIX不兼容,但是它提供了兼容功能,并且可以通过这种方式进行访问(因为Solaris是经过认证的Unix)。getconf PATH将包含/usr/xpg4/bin在最前面,其中包含POSIX sh和许多其他必需的工具(包括无用的cd工具,例如)。


关于Solaris:...除非正在运行Solaris“小型服务器”安装,否则将省略许多POSIX工具。参见unix.stackexchange.com/q/360359/135943
通配符

“没用”的?我宁愿称他们为多余。
Mukesh Sai Kumar

2
那么如何找到getconf?
约书亚

@MukeshSaiKumar一个独立的“ cd”命令永远无法工作
OrangeDog

好吧,它只会“工作”一个有意义的值,例如,测试您是否可以更改到目录,但实际上不会将调用它的进程留在那里。但是,功能比根本没有。
查尔斯·达菲

12

不,不需要sh位于中/bin。它明确引用/bin,,/usr/bin/usr/xpg4/bin尽可能引用。POSIX规范仅要求sh在PATH中。

POSIX规范状态:

应用程序应注意,不能假定到外壳程序的标准PATH是/bin/sh/usr/bin/sh,并且应通过查询getconf PATH返回的PATH来确定,确保返回的路径名是绝对路径名而不是内置的Shell。

例如,确定标准sh实用程序的位置:

command -v sh

在某些实现中,可能会返回:

/usr/xpg4/bin/sh


2

正如这里的其他人所说,这并不是POSIX合规性的严格要求。

但是可以说与现有软件的兼容性要重要得多(毕竟,POSIX的目的是使某些功能在所有兼容的操作系统上都可以运行),并且如果操作系统不提供sh at /bin/sh,那将会破坏某些功能。

最明显的是,#!/bin/sh依赖于此路径的脚本被标准化。这不是必需的。POSIX甚至不需要#!支持行,尽管它提到了这种功能是常见的

一些历史实现处理外壳脚本的另一种方式是将文件的前两个字节识别为字符串“#!”。并使用文件第一行的其余部分作为要执行的命令解释器的名称。

但是,如果不支持该功能,则许多现有软件都将损坏或需要额外的工作才能移植。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.