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中它不支持。我认为检查执行得很差。@jordanm
bash
ksh
都支持将参数传递给源文件。最简单的修复方法就是从脚本中去掉这种牵手。