zsh/bash源命令行为差异
我试图在zsh/bash源命令行为差异,zsh,Zsh,我试图在zsh(名为setup_env.sh存储在~/中)中获取第三方脚本的源代码,该脚本开头有以下几行代码,以防止意外执行: #!/bin/sh # Guard the script against execution - it must be sourced! echo $0 | egrep 'setup_env.sh' > /dev/null if [ $? -eq 0 ]; then echo "" echo "ERROR: the setup file must be SOUR
zsh
(名为setup_env.sh
存储在~/
中)中获取第三方脚本的源代码,该脚本开头有以下几行代码,以防止意外执行:
#!/bin/sh
# Guard the script against execution - it must be sourced!
echo $0 | egrep 'setup_env.sh' > /dev/null
if [ $? -eq 0 ]; then
echo ""
echo "ERROR: the setup file must be SOURCED, NOT EXECUTED in a shell."
echo "Try (for bash) : source setup_env.sh"
echo "Or (eg. for ksh): . setup_env.sh"
exit 1
fi
# export some environment variables
...
当我使用source~/setup\u env.sh
为这个脚本编写源代码时,我看到上面代码块中显示的错误消息
从脚本中可以明显看出,它的编写没有考虑zsh
。但是我仍然想知道为什么zsh
会有这种行为,以及是否有可能按原样编写脚本
我可以使用bash
按原样编写脚本,而不会出错。
在脚本开头注释掉保护块之后,我还可以在zsh
中找到它的源代码
有人能解释一下
zsh
和bash
之间source
命令的行为差异吗?zsh/bash有不同的方法来检测源代码,以下两种方法都适用:
if [[ -n $ZSH_VERSION && $ZSH_EVAL_CONTEXT == toplevel ]] || \
[[ -n $BASH_VERSION && $BASH_SOURCE == $0 ]]; then
echo "Not sourced"
exit 1
fi
再解释一下,当你跑步时:
source setup_env.sh
# setup_env.sh containing "echo $0"
在zsh中,$0==setup_env.sh
在bash中,$0==bash可能是因为zsh中的
和source
支持其他参数,但在bash或ksh中它不支持。我认为检查执行得很差。@jordanmbash
和ksh
都支持将参数传递给源文件。最简单的修复方法就是从脚本中去掉这种牵手。