由于 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