在一个bash脚本中,如何运行在外部定义的bash函数?

8
例如,以下命令无法运行。 我想知道如何解决它,谢谢。
[liuke@liuke-mbp ~]$ function showxx() { echo xx; }
[liuke@liuke-mbp ~]$ showxx
xx
[liuke@liuke-mbp ~]$ cat a.bash 
#!/bin/bash
showxx
[liuke@liuke-mbp ~]$ ./a.bash 
./a.bash: line 2: showxx: command not found
4个回答

6

你需要导出你的函数。你可以使用set -a一次性导出所有内容(我个人偏好),或者使用export -f showxx单独导出函数。无论哪种方式,都会将它们放入环境中,子shell将能够获取它们。


4

您需要定义函数以出现在本地进程的“范围”中。

当您在命令行上输入一个函数时,它现在“存在于”终端shell的bash副本中。

当您启动脚本时,只有标记为export的变量才能在作为终端子进程运行的新bash副本中看到。(我们现在不会深入讨论export)。

要在脚本中获取函数,您必须在脚本内部定义它。

cat a.bash
#!/bin/bash
function showxx() { echo xx; }
showxx

或者你可以将函数放在一个单独的文件中,然后用“source”(使用“.”)引用它,这样就好像它在文件内部一样,即

 cat    showxx.bfn
 function showxx() { echo xx; }

 cat a.bash
 . showxx.bfn
 showxx

扩展名.bfn只是我用来帮助记录文件内部内容的方式,例如bfn='bash函数'。
'.'是源命令。
希望这可以帮到你。
附注:由于你似乎是新用户,如果得到有用的答案,请记得将其标记为已接受,并/或给予+(或-)作为有用的答案。

3
使用前置点和空格来调用您的脚本。 . a.bash

2
假设您的脚本名为myscript.sh,其内容如下:
#!/bin/bash

if [ "$#" -gt 0 ]; then
    export command=$1
    foo() {
        echo "foo function run"
    }
    bar() {
        echo "bar function run"
    }
fi
$command

如果你执行./myscript.sh foo,那么foo函数将被执行。如果你执行./myscript.sh bar,那么bar函数将被执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接