如何定义一个适用于任何脚本的bash函数?

13

我希望只定义一次,然后在任何地方都可以使用它。

4个回答

8
在Bash中,你可以从你的脚本中运行source(并将包含你的函数的文件作为参数),然后直接调用该函数。当你在.bashrc文件中定义函数时,这就是隐式发生的事情。

是的,简短的回答:使用“source”或单点“.”命令导入脚本。 - Spencer Williams

7

虽然我基本上同意@eduffy的观点,但我通常会将这样的函数放在用户主目录中的文件中,或者如果脚本在用户之间共享,则放在用户路径中的目录中。然后,在.bash_profile中调用该文件(. ~/FILE或. $(type -p FILE))。这样,如果需要重新加载文件(即更改其中的内容),就可以“重新加载”该文件,而无需重新登录等操作。


2
但是任何读者也需要意识到,您必须像这样导出函数名称:export -f funcname。 - grok12
1
对于源文件来说,导出通常是可选的,因为它们在执行它们的环境中被执行。在 FILE 中定义的所有内容都将在用户的 shell 中可用于后续脚本(除非取消设置)。当您想要在父 shell 执行期间使变量(或函数)对子 shell 可见时,需要进行导出。 - Jay

6

把您的“常用”函数放在一个单独的脚本中(我们称之为“a”):

#!/bin/bash

test_fun () {
    echo "hi"
}

接下来,将其“导入”到另一个脚本(比如“b”)中:
#!/bin/bash

. ./a

test_fun

运行bash b 将输出 "hi"


这对我没有用。然而,像这个答案中描述的那样,执行 source ../a 就可以了。https://dev59.com/rXNA5IYBdhLWcg3wUL5Y#1016415 - Fostah
为什么文件"a"需要初始的hashbang行?由于"a"并不打算作为可执行文件运行,而只是从现有的Bash环境中获取源代码,因此该hashbang永远不会被使用,甚至可能会误导人(因为它暗示了该文件是有用的可执行文件,但实际上并不是)。 - Jonathan Hartley

2
将其放入您的~/.bashrc~/.bash_profile中。

1
.bash_profile 只被登录 shell 引用,所以 .bashrc 是函数和别名的正确位置。这与从父进程传递给子进程的环境变量不同。 - cababunga
我已经在两个文件中尝试过,并打开了新的终端窗口,但都无法工作。我还尝试从.bashrc导出它,但也没有帮助。 - grok12
然而,“compgen -A function”可以找到它。 - grok12
1
@cababunga:不要!将它放在~/.bash_profile中,并在其后跟随export -f funcname。 - grok12
如果您从父进程中执行shell,例如在vim中执行:sh,那么仅出现在.bash_profile而不在.bashrc中的任何内容都将在该环境中不可见。 - Dejay Clayton

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