在 bash 函数定义中使用未设置的变量有危险吗?

在 bash 函数定义中使用未设置的变量有危险吗?

进行了一些代码重构,我意识到我不知道这是否重要:

函数定义将来自另一个文件(一种库)。该函数使用函数体内的某些变量。这些变量将在函数实际运行时设置被称为在脚本中,但如果我可以在开始脚本的;但是此时变量尚未定义。

这样做有什么坏处吗?据我所知 bash 实际上不会对函数定义做任何事情直到它被调用......对吗?在这种情况下,函数中使用的未设置变量并不重要,因为这些变量将在函数实际运行之前包含正确的值。被称为

或者在函数定义中包含迄今为止未设置的变量会搞砸事情吗?

答案1

fn(){ printf %s\\n "${v-not set}"; }
v=value; fn; unset v; fn

value
not set

shell 函数是存储在 shell 内存中的文字字符串。在定义时它被解析,但不评估扩展(除了 shell 别名)或重定向。这些仅在以下时间进行评估称呼时间。

事实上,并且有些相关的是,通过这种方式,可以让函数在每次调用时使用新的临时文件定义自己的输入。

fn(){ ls -l /dev/fd/0; cat; } <<INFILE
$@
INFILE
fn some args; fn other args

#in dash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4076148]
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4077081]
other args
#bash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-1036060995 (deleted)
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-531856742 (deleted)
other args

相关内容