我已经阅读过POSIX兼容的操作系统(例如:Linux)必须具有sh
外壳程序。
但是它是否sh
必须位于/bin
目录中,或者可以位于任何目录中?
sh
?答案是:shebang也不是POSIX的一部分,因此问题甚至没有出现。
/bin/sh
必须在POSIX系统上存在。
/bin/sh
是的链接dash
。在BSD上,/bin/sh
它不是链接,而是单独的可执行文件,当然也不是bash
。
我已经阅读过POSIX兼容的操作系统(例如:Linux)必须具有sh
外壳程序。
但是它是否sh
必须位于/bin
目录中,或者可以位于任何目录中?
sh
?答案是:shebang也不是POSIX的一部分,因此问题甚至没有出现。
/bin/sh
必须在POSIX系统上存在。
/bin/sh
是的链接dash
。在BSD上,/bin/sh
它不是链接,而是单独的可执行文件,当然也不是bash
。
Answers:
POSIX只强制要求/dev
和/tmp
目录的存在,以及/dev/null
,/dev/tty
和/dev/console
文件。标准实用程序必须存在,但未指定特定位置。可能根本不存在/bin
,如果存在可能不包含sh
,并且如果不存在则可能不是POSIX sh
。
您可以使用以下命令获取PATH
包含POSIX工具(包括)的有效变量:sh
getconf
$ PATH=$(getconf PATH)
$ sh
例如,这在Solaris上很有用,因为Solaris 的默认sh
sh
设置与POSIX不兼容,但是它提供了兼容功能,并且可以通过这种方式进行访问(因为Solaris是经过认证的Unix)。getconf PATH
将包含/usr/xpg4/bin
在最前面,其中包含POSIX sh
和许多其他必需的工具(包括无用的cd
工具,例如)。
正如这里的其他人所说,这并不是POSIX合规性的严格要求。
但是可以说与现有软件的兼容性要重要得多(毕竟,POSIX的目的是使某些功能在所有兼容的操作系统上都可以运行),并且如果操作系统不提供sh at /bin/sh
,那将会破坏某些功能。
最明显的是,#!/bin/sh
依赖于此路径的脚本被标准化。这不是必需的。POSIX甚至不需要#!
支持行,尽管它提到了这种功能是常见的:
一些历史实现处理外壳脚本的另一种方式是将文件的前两个字节识别为字符串“#!”。并使用文件第一行的其余部分作为要执行的命令解释器的名称。
但是,如果不支持该功能,则许多现有软件都将损坏或需要额外的工作才能移植。
/bin/sh
在大多数情况下,在Linux上,它已经是的符号链接bash
。只是很多脚本都使用了硬编码/bin/sh