![Shebang 线路“用 $SHELL 运行”](https://linux22.com/image/77376/Shebang%20%E7%BA%BF%E8%B7%AF%E2%80%9C%E7%94%A8%20%24SHELL%20%E8%BF%90%E8%A1%8C%E2%80%9D.png)
我正在寻找什么可以放在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