如何确定Bash中的shell脚本文件是否被引用

11

我想知道如何确定脚本文件是被执行还是被引用。

举个例子,

# Shell script filename build.sh
if [ "x$0" = "xbash" ]; then
    echo "I am sourced by Bash"
else
    echo "I am executed by Bash"
fi

如果我输入了

source build.sh

它将输出I am sourced by Bash

如果我输入:

./build.sh

它将输出我被Bash执行。

目前,我使用$0来实现这一点。是否有更好的想法?

受Tripeee启发,我找到了一种更好的方法:

#!/bin/bash

if [ "x$(awk -F/ '{print $NF}' <<< $0)" = 'xcdruntime' ]; then
    echo Try to source me, not execute me.
else
    cd /opt/www/app/pepsi/protected/runtime
fi

你的解决方案不起作用,因为你可以通过 bash build.sh 运行脚本。另外请注意,脚本可能会自我引用——这有点愚蠢,但是可能发生。 - user123444555621
@Pumbaa80 嗯...我已经尝试过 bash build.sh,我的解决方案仍然有效。 - hellojinjie
有趣的是:永远不要将你的源脚本命名为 bash,否则你会感到困惑! - Jonathan Leffler
您不需要使用 x 标记来防止空字符串。 - chepner
1个回答

10

如果被另一个脚本引用,它就不起作用了。我会反过来做;

test "X$(basename -- "$0")" = "Xbuild.sh" || echo Being sourced

更新:对两个字符串都添加了X前缀。

同样更新:对basename调用添加了双破折号。


是的,你的解决方案比我的好。如果脚本被另一个脚本引用,$0 将不会是 bash - hellojinjie
1
哎呀,你说得对。我更新了我的回答。感谢你的反馈。 - tripleee
1
实际上,您可以使用 $(basename -- "$0") 来解决这个问题。双破折号在我的版本的 basename 中没有记录,但是它是一个被广泛支持的约定。 - tripleee
1
你不需要在字符串前面加上“X”前缀。只要两个字符串都用引号引起来,test 就能正确处理你输入的任何字符串,无论它是空的还是以破折号开头。 - Søren Løvborg
1
相对较新的 test 版本可以处理以破折号开头的值,但这并非总是如此。 - tripleee
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接