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

huy*_*uyz 7 linux zsh shell

因为诸如 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。

Bry*_*ery 6

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

#! /bin/sh

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

## Your ZSH script here
Run Code Online (Sandbox Code Playgroud)

其他一些尝试的方法包括

  • 通过在/ usr / bin中/ ENV其修改其行为与传递ENV变量,--options比如做
    #!/usr/bin/env POSIXLY_CORRECT=1 bash
  • 使用巧妙的注释技巧,例如该脚本如何开始使用 SH 但在同一脚本上调用 TCL
    #!/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

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