【发布时间】:2017-10-13 09:29:29
【问题描述】:
我正在尝试获取 bash 文件的特定功能。 请在下面找到简化的 loadfun.sh :-
function a(){
echo "This is a"
}
function b(){
echo "This is b"
}
function load(){
echo "exporting $1"
export -f $1
}
$@
另外,请查看以下命令的执行顺序:-
$cat loadfun.sh
function a(){
echo "This is a"
}
function b(){
echo "This is b"
}
function load(){
echo "exporting $1"
export -f $1
}
$@
$
$
$
$sh loadfun.sh a
This is a
$
$
$a
bash: a: command not found
$
$
$sh loadfun.sh load a
exporting a
$
$
$
$a
bash: a: command not found
$
我不知道为什么
导出-f a
没有导出函数a。
【问题讨论】:
-
当您运行
sh command...时,它会创建一个新的子进程并在其中运行sh。我认为导出适用于这个子进程,但不适用于您的 shell。这似乎相关:stackoverflow.com/questions/16618071/… -
Export 仅使子进程可用。子进程不能改变父环境。
-
(而
sh yourscript甚至没有运行 bash ——它正在运行/bin/sh,这不能保证完全支持函数导出;所以即使您希望在中使用导出函数的进程是sh yourscript的子进程,但仍不能保证它存在)。 -
不过,要理解的重要一点是,
export将变量作为函数执行相同的操作——它使该变量可用于当前 shell 的子进程我>。不是父母——即。启动 shell 的东西——更确切地说,进程 由 shell 启动。 -
(顺便说一句——裸
$@与运行$*有完全相同的错误。始终使用"$@"代替;这是shellcheck.net 会发现的问题)。