在 Python 中,常见的习惯用法是编写如下代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def main():
pass
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
这样做是为了如果导入而不是执行 Python 脚本,则其 main 方法将不会运行。
Bash 中有类似的习惯用法吗?
您可以在脚本顶部使用此代码片段来确定脚本是否源自:
#!/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,否则它保存脚本本身的名称。
bash为此有一个特殊的变量,
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)
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |