目前正在学习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 ~]$
所以这是哪里出了问题了?
原因应该是因为./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里的函数。