当前位置: 首页 > 知识库问答 >
问题:

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

闻人越
2023-05-08

目前正在学习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 ~]$

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

共有1个答案

巫化
2023-05-08

原因应该是因为./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)"
 类似资料:
  • 我创建了一个扫描器,从命令行中的第一个元素读取文本文件,但它会导致。如何将其格式化为接受此文件的位置? 下面是我的代码: 例如,如果文件名是,我将作为命令行中的第一个元素。

  • 我理解下面的代码可以正常工作。在阅读Python中的while循环文档时,他们说while表达式应该是True或False,这很有意义。 现在,函数返回字符串。那么这个while循环是如何工作的呢?

  • 我想使用Windows 10上的命令行中的,以及许多其他Linux工具。我知道有GnuWin32和其他二进制替代品,但没有一个能像Linux的Windows子系统(WSL)那样优雅地工作;包括更新机制。 使用WSL,可以调用

  • 问题内容: 我无法弄清楚/的运作方式。我对此有些了解,但无法使其正常工作。 我知道我可以使用,但是如果这样做,我知道我永远不会理解/ 我只会埋葬这个问题。 目标:调用并返回文件的内容。 每次调用该文件都会增加一次(每页加载)。该文件包含二进制缓冲区的转储,并存储在SSD中。 无论我做什么,都会出现错误或在控制台中。 问题答案: 要使用/,您需要返回承诺的方法。没有包装器,核心API函数就不会这样做

  • 我想以UTF-8快速地逐行读取大的csv文件(大约~1GB)。我已经为它创建了一个类,但它不能正常工作。UTF-8从2字节解码西里尔符号。我使用字节缓冲区来读取它,例如,它有10个字节的长度。因此,如果文件中的符号由10和11字节组成,它将无法正常解码:(

  • 嗨,我正在阅读文件使用FileReader和BuffeReader只和它是完美的工作 但我想读取并将这些文件放在某个地方,这样我就可以将它们放在参考库中,这样我就可以在任何没有路径的机器上读取它们,但它不起作用:/ 有什么帮助吗?