#!/usr/bin/env 解释器参数——带有解释器参数的可移植脚本

#!/usr/bin/env 解释器参数——带有解释器参数的可移植脚本

由于 zsh、bash、python、perl 等解释器可能位于文件系统的不同位置,因此脚本通常有一个用于env可移植性的 shebang,例如#!/usr/bin/env zsh。然而,http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability解释说,包括 Linux 在内的许多系统不允许将参数传递给解释器。

通常,我想做一些事情,比如#!/usr/bin/env zsh -f阻止我的脚本读取我的~/.zshenv,或者我想做#!/usr/bin/env perl -w等等。这在 OS X 上有效,但在 Linux 上无效。

有什么解决方法?我能同时拥有两全其美吗:可移植性和解释器参数?如果可能的话,请给出一个适用于所有解释器(而不仅仅是 zsh)的通用解决方法。

答案1

这是解决 ZSH 可移植性问题的内联解决方案。

#! /bin/sh

if [ -z "$IN_ZSH" ]; then
  export IN_ZSH=1
  exec zsh -f "$0" "$@"
fi

## Your ZSH script here

可以尝试的其他方法包括

  • 通过 /usr/bin/env 传递环境变量,修改行为,就像--options这样做一样
    #!/usr/bin/env POSIXLY_CORRECT=1 bash
  • 使用巧妙的注释技巧,例如此脚本一开始使用 SH,但在同一脚本上调用 TCL
    /bin/sh #!/bin/sh
    # \
    TCLBIN=/usr/bin/tclsh;\
    执行 $TCLBIN "$0" "$@"
    # 通过 tclsh 执行其余部分
    设置参数
  • 在解释器中设置一次选项,如果--options传入的选项不会影响加载行为
    #!/usr/bin/env bash
    # 如果检测到任何错误则退出
    设置-e
  • 对于 perl,如果您可以使用较新的版本,这可以代替 -w:
    #!/usr/bin/env perl
    使用警告;
  • 使用引导invoke.sh脚本而不是 /usr/bin/env 来使用您的 PATH,使用/path/to/invoke.sh script以开头的脚本调用#! zsh -f
    /bin/sh #!/bin/sh

    脚本=$1
    班次 1
    cmd =`sed -n -e 's:#! \?::' -e '1p' $SCRIPT`
    执行$cmd $SCRIPT

相关内容