Tips

BASH: \LS

前缀\的目的是避免alias替换,使用命令的原生目标来执行。当 alias ls=’ls –color’ 时,ls的输出结果是带高亮色的,\ls则避免了alias替换,输出结果没有高亮色。

BASH:函数名

1
2
3
4
5
6
function test_func()
{
    echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
    another_func
    echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
}

$FUNCNAME是一个数组,包含倒序的函数名调用栈。例如“(child_func parent_func main_entry main)”,其中main_entry是首个函数调用入口,然后依次嵌套调用函数 parent_func 和 child_func,而main是一个伪函数名,它表示整个脚本文件。

BASH:避免多次SOURCE

  1. BASH自身检测SOURCE状态
  2. 使用一个环境变量来标识已经source过了
1
2
3
4
5
6
7
8
9
10
_sourced_="__sourced_$$__"

echo "Flag variable $_sourced_=${!_sourced_}"

if [ -z "${!_sourced_}" ]; then
    eval "$_sourced_=1"
    echo "It is the first time to source script"
else
    echo "The script have been sourced"
fi

以及:

1
function if_in_source () { [[ $- = *i* ]]; }

以及:

1
2
3
4
5
6
7
8
9
# If the script is sourced by another script
if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]
then
    do_something
else # Otherwise, run directly in the shell
    do_other
fi

function if_in_source () { [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]; }

🔚