推荐的POSIX sh shebang是什么

Jep*_*epZ 5 shell posix sh

我读过,如果您想以便携式方式使用Bash,则应该使用shebang:

#!/usr/bin/env bash

但是现在我想知道:当我想明确声明我不依赖Bash而是编写了POSIX兼容脚本时,我应该使用:

#!/bin/sh

还是#!/usr/bin/env sh在这里更可取?

Ant*_*ica 8

形式角度

该信息部分中的POSIX规范SH:应用程序使用的状态,你不能依靠sh可执行被安装在/bin/sh。

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

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

command -v sh
Run Code Online (Sandbox Code Playgroud)

但是,不是建议使用env来使用适当的PATH,而是建议在安装时修改shell脚本以使用指向sh以下命令的完整路径:

此外,在支持可执行脚本(“ #!”构造)的系统上,建议使用可执行脚本的应用程序使用getconf PATH安装它们, 以确定外壳程序路径名,并#!在安装脚本时适当地对其进行更新(例如,使用 sed)。

在实践中

我主要编写POSIX Shell脚本,实际上,每个GNU / Linux系统(基于Red Hat和Debian的系统)以及Cygwin和OS X等其他系统sh都安装了POSIX兼容软件,/bin/sh或者可以通过软链接或硬链接使用在这条路。我从来不需要使用它env来迎合sh不使用此路径的系统。

在某些Unix系统中,可能sh没有POSIX兼容的/bin/sh。POSIX规范建议它可以作为某些系统安装/usr/xpg4/bin/sh。据我了解,对于Solaris系统而言确实如此(是?)/bin/sh,因为Bourne Shell的早期版本早于POSIX。在这种情况下,使用env sh不能保证会有所帮助,因为它仍然可以/bin/sh在的POSIX Shell之前找到Bourne Shell(位于)/usr/xpg4/bin/sh。

摘要

如果要为常见的Unix和Linux操作系统编写POSIX shell脚本,只需将其#!/bin/sh用作shebang。

在极少数情况下/bin/sh是Bourne外壳而不是POSIX兼容外壳的情况下,您必须修改shebang以使用指向POSIX外壳的适当完整路径。

在这两种情况下,使用都没有好处#!/usr/bin/env sh-与仅使用相比,失败的可能性更大#!/bin/sh。

  • 那些“想要”Solaris 上的 POSIX 语义的人难道不会简单地确保“/usr/xpg4/bin”在其“PATH”中位于“/usr”之前吗? (2认同)