POSIX shell 脚本 shebang #!/bin/sh 与 #!/usr/bin/env sh,有什么区别吗?

POSIX shell 脚本 shebang #!/bin/sh 与 #!/usr/bin/env sh,有什么区别吗?

我最近注意到许多脚本都/usr/bin/env在他们的舍邦。我看到主要使用重击Python,但迄今为止从未与POSIX sh( ash,, dash...)。

我想知道为什么,如果我的本意是高度便携的,POSIXshell 脚本可能会从该env方法中受益?


对于是否使用是否存在普遍共识:

  • 标准:

    #!/bin/sh
    
  • 环境:

    #!/usr/bin/env sh
    

让我充分强调这一点:

我从来没有见过这个sh

答案1

设置为#!/bin/sh将直接转到该文件/bin/sh

设置为#!/usr/bin/env sh将使用/usr/bin/env参数执行sh。这将导致脚本通过shin变量执行, PATH而不是通过 显式执行/bin/sh

答案2

许多其他帖子(例如接受的答案这个)提到,bin/sh在 Solaris 系统(10 或更早版本)中,它不是 POSIX 兼容的 shell,而是位于/usr/xpg4/bin/sh.

在这种情况下,#!/bin/sh如果它符合 POSIX 标准,则可能无法正常工作。但是,我怀疑#!/usr/bin/env sh是否会指向所需的外壳。

相关内容