Bash 脚本可以确定它是否已被获取吗?

Naf*_*Kay 5 python bash

在 Python 中,常见的习惯用法是编写如下代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
    pass

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

这样做是为了如果导入而不是执行 Python 脚本,则其 main 方法将不会运行。

Bash 中有类似的习惯用法吗?

anu*_*ava 7

您可以在脚本顶部使用此代码片段来确定脚本是否源自:

#!/bin/bash

if [[ ${BASH_SOURCE[0]} != $0 ]]; then
   printf "script '%s' is sourced in\n" "${BASH_SOURCE[0]}"
fi
Run Code Online (Sandbox Code Playgroud)

当脚本被获取时,则$0变为-bash,否则它保存脚本本身的名称。

  • `++` 用于演示如何在脚本中使用,我自己没有机会使用它,只是知道它存在。 (2认同)

Ini*_*ian 4

bash为此有一个特殊的变量,

BASH_SOURCE

An array variable whose members are the source filenames where the corresponding shell function names in the FUNCNAME array variable are defined. The shell function ${FUNCNAME[$i]} is defined in the file ${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}

它实际上是一个数组变量,保存源的堆栈跟踪,其中${BASH_SOURCE[0]}是最新的。

一个从本网站无耻地窃取的示例,仅用于演示目的,

脚本aaa.sh

#!/bin/bash
echo "from ${BASH_SOURCE[0]} : BASH_SOURCE = ${BASH_SOURCE[*]}"
source bbb.sh
Run Code Online (Sandbox Code Playgroud)

脚本bbb.sh

#!/bin/bash
echo "from ${BASH_SOURCE[0]} : BASH_SOURCE = ${BASH_SOURCE[*]}"
source ccc.sh
Run Code Online (Sandbox Code Playgroud)

脚本ccc.sh

#!/bin/bash
echo "from ${BASH_SOURCE[0]} : BASH_SOURCE = ${BASH_SOURCE[*]}"
for i in ${BASH_SOURCE[@]}; do
    readlink -f $i
done
Run Code Online (Sandbox Code Playgroud)

跑步aaa.sh产生,

from aaa.sh : BASH_SOURCE = aaa.sh                
from bbb.sh : BASH_SOURCE = bbb.sh aaa.sh
from ccc.sh : BASH_SOURCE = ccc.sh bbb.sh aaa.sh
/tmp/ccc.sh                                       # -> first element showing the latest script sourced 
/tmp/bbb.sh
/tmp/aaa.sh
Run Code Online (Sandbox Code Playgroud)