Shebang 线路“用 $SHELL 运行”

Shebang 线路“用 $SHELL 运行”

我正在寻找什么可以放在my_zsh_script.sh“shebang line”上以达到相同的效果,便携式的, 作为

$SHELL my_zsh_script.sh

IOW,我正在寻找有效的等价物

#!$SHELL

或者

#!/usr/bin/env $SHELL    

(在某些系统中,我的值$SHELL是一个版本zsh,在某些情况下,与#!/usr/bin/env zsh解析的值不同。)

我想我总是可以安排定制my_zsh_script.sh,并为每个我可能想要运行它的主机进行硬编码正确的 shebang 行。我希望能够避免这种情况。

答案1

#!/bin/sh
my_script(){
    { cat; cat <&3; }>"$0"
} <<SHEBANG 3<<\SCRIPT
#!${SHELL}
SHEBANG
#now all the rest of your script

#goes in here

SCRIPT

my_script

大多数 shell 会自动将此处文档的所有内容放入安全临时文件中。那些不使用管道的缓冲区,这些缓冲区通常足以容纳 shell 脚本写入,但当然,它们并不是确定的事情。

和函数是存储在 shell 内存中的文字字符串。执行上述操作应该只需要一次,之后您的脚本将由$SHELL您运​​行它时的任何内容来解释。

答案2

以下检查某些特殊环境变量是否设置为某个非空值。如果不是,则脚本将使用 重新运行自身$SHELL,但这次是在设置了特殊变量的环境中。一旦设置了特殊变量,脚本就会按预期执行。

#!/bin/sh

if [ -z "$__run_with_zsh" ]; then
    __run_with_zsh=1 exec "$SHELL" "$0" "$@"
fi

# Rest of script here

相关内容