如何正确调用在.bashrc文件中通过source命令读取的库文件的函数?

新手上路,请多包涵

目前正在学习Linux,在《Linux命令行与shell脚本编程大全(第3版)》的17.7.2小节中,作者写到:“只要是在shell脚本中,都可以用source命令(或者它的别名点操作符)将库文件中的函数
添加到你的.bashrc脚本中......更好的是,shell还会将定义好的函数传给子shell进程,这样一来,这些函数就自动能够用于该shell会话中的任何shell脚本了。”,原文如下图所示:


然后我尝试按照原书的思路来编写与原书相似的库文件与脚本文件,但是在脚本文件中调用库文件的函数时却提示我“找不到该命令”,如下所示:

[meerkat@server ~]$ cat myfuncs 
function addem {
    echo $[ $1 + $2 ]
}

function multem {
    echo $[ $1 * $2 ]
}

function divem {
    if [ $2 -ne 0 ]
    then
        echo $[ $1 / $2 ]
    else
        echo -1
    fi
}
[meerkat@server ~]$ tail -3 .bashrc
# User specific aliases and functions

source /home/meerkat/myfuncs
[meerkat@server ~]$ cat script.sh 
#!/bin/bash

read -p "Please enter an integer: " first
read -p "Now, enter the next integer: " second

echo "$first + $second = $(addem $first $second)"
echo "$first * $second = $(multem $first $second)"
echo "$first / $second = $(divem $first $second)"
[meerkat@server ~]$ source .bashrc
[meerkat@server ~]$ ./script.sh 
Please enter an integer: 12
Now, enter the next integer: 6
./script.sh: line 6: addem: command not found
12 + 6 = 
./script.sh: line 7: multem: command not found
12 * 6 = 
./script.sh: line 8: divem: command not found
12 / 6 =
[meerkat@server ~]$ 

但是使用source命令运行脚本文件后可以正确调用,而且在命令行上也可以正确调用,如下所示:

[meerkat@server ~]$ source .bashrc
[meerkat@server ~]$ source script.sh 
Please enter an integer: 12
Now, enter the next integer: 6
12 + 6 = 18
12 * 6 = 72
12 / 6 = 2
[meerkat@server ~]$ addem 12 6
18
[meerkat@server ~]$ multem 12 6
72
[meerkat@server ~]$ divem 12 6
2
[meerkat@server ~]$

所以这是哪里出了问题了?

阅读 2.4k
1 个回答

原因应该是因为./script.sh这一步是在一个新的子shell里面的执行的,而这个子shell并不会继承父shell里的source /home/meerkat/myfuncs,你可以通过source script.sh 命令来执行script.sh脚本,这个时候script.sh将在当前shell中执行,此时它应该能够正常调用到myfuncs里面的函数,或者你也可以改写script.sh,然后通过./script.sh或者sh script.sh的方式运行脚本,也能正常调用myfuncs里的函数。

#!/bin/bash
source /home/meerkat/myfuncs
read -p "Please enter an integer: " first
read -p "Now, enter the next integer: " second

echo "$first + $second = $(addem $first $second)"
echo "$first * $second = $(multem $first $second)"
echo "$first / $second = $(divem $first $second)"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题