如何从shell中调用在.bashrc中定义的函数?

85

在我的 .bashrc 文件中,我有一个名为 hello 的函数:

function hello() {
   echo "Hello, $1!"
}

我希望能够通过以下方式在shell中调用hello():

$ hello Lloyd

然后获得输出:

> Hello, Lloyd!

有什么诀窍吗?

(当然,我心中想的真正函数更加复杂。)

编辑:我认为这真的是由函数中的语法错误引起的!:(

function coolness() {

    if[ [-z "$1"] -o [-z "$2"] ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}

1
你应该能够从shell中调用在.bashrc中定义的函数,因为它应该被你的shell引用。你的不能吗? - Cascabel
3
啊,你的意思是你想从脚本中调用它,而不是从交互式 shell 中调用?建议你更新问题描述以反映这一点,这样其他人才能找到你的问题。(bashrc 文件通常不会被非交互式 shell 自动载入。) - Cascabel
标题非常误导人,它与您实际想要问的问题不符,因此也与您接受的答案不符。这使得使用它来帮助其他人解决相关问题变得棘手。 - Charles Duffy
请查看bash man-page的_INVOCATION_部分,以了解.bashrc在何种条件下被您的shell处理。 - undefined
你的函数 coolness 当然在语法上是不正确的。你可以通过将它粘贴到 shellcheck 中来追踪这类问题。 - undefined
5个回答

131

你可以导出函数。在你定义函数之后,在~/.bashrc文件中添加export -f 函数名

function hello() {
   echo "Hello, $1!"
}

export -f hello
然后该函数将可以在shell提示符下使用,也可以在其他从那里调用的脚本中使用。
请注意,除非将其用于子进程(上一句中的“也”),否则不必导出函数。即使是这样,通常最好将函数“source”到将要使用它的文件中。 编辑: Bash条件语句中的括号不是括号,而是命令。它们周围必须有空格。如果想对条件进行分组,请使用括号。下面是你的函数:
function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}

写这个条件语句的更好方式是:

    if [[ -z "$1" || -z "$2" ]]; then

因为双括号比单括号提供更多的功能。


-o[[ ]] 中无效。应该使用 || - Charles Duffy
谢谢,那个可行。在调用函数时,我们不需要在结尾处加括号。 - Liker777

34

你的函数中的测试不会起作用 - 你不应该在-z子句周围加括号,并且if和开括号之间应该有一个空格。它应该写成:

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
    echo "Hi!"
}

1
小提示,exit 1 可能会关闭你的终端,你无法看到 Usage。你可能想使用 return 1 代替。 - NeverEndingQueue
-oPOSIX test标准中被标记为过时。正确的写法是[ -z "$1" ] || [ -z "$2" ] - Charles Duffy
它是否可以像 run.sh 文件那样从另一个文件中访问? - alper

20

在你的脚本中加入这一行

source .bashrc

尝试使用source结构,它应该可以工作!


3
这个 if 语句不起作用!(我精通Java,但Bash让我束手无策) - les2

18

.bashrc文件的任何更改只有在新的终端会话中才会生效。如果您想将更改应用于当前的终端会话,则必须指示shell重新读取.bashrc文件。最简短的方法是使用.命令,它是source的同义词:

[user@linuxPc]$ . ~/.bashrc

1
输入以下命令 . ~/.bashrc 即可在任何目录下生效。 - Katastic Voyage
我们可以使用不同的文件名来完成吗?比如:. ~/.global_functions - alper

5
$ source .bashrc

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