~/.bashrc 中的脚本在手动执行时有效,但在其他情况下无效

~/.bashrc 中的脚本在手动执行时有效,但在其他情况下无效

这很奇怪。
所以我开发了一个叫做的东西SahibLib,它基本上是一个脚本,你可以从中获取一堆其他脚本。

它的目录树如下所示:

/home
    |- /home/myuser
       |- /home/myuser/sahiblib
          |- sahibload <- executed in ~/.bashrc
          |- sahiblib <- executed by sahibload
          |- modules
             |- core.sls <- problem file
             |- example.sls <- problem file

SahibLib 是什么应该要做的是获取.sls文件。但它并没有这样做。

它输出正确的消息(“[成功] 谢谢,再见。”),但实际文件没有来源。

myuser@mypc:~$ slhelp
Invalid command.

奇怪的是,当我手动获取文件时,它起作用了:

myuser@mypc:~$ . ~/.bashrc
[SUCCESS] Thank you and goodbye.
myuser@mypc:~$ slhelp
SahibLib Core Help
...

我的问题是,为什么脚本不能在 ~/.bashrc 中正确执行


更新:向 写入一些调试命令core.sls,似乎文件执行完美。它到达文件末尾,并返回标准退出代码。这使得问题更加更多的很奇怪,因为现在看来 Bash 完全忽略了函数定义。此外,如果您需要查看core.sls或任何文件,它们都可以使用这里

答案1

你的链接,在该页面的底部附近,我看到了这一行:

echo "/home/myusername/sahiblib/sahibload" >> ~/.bashrc

这表明,当~/.bashrc运行时,它将执行 sahibload没有来源。这意味着 当 的执行完成并且控制权返回sahibload时, 定义的任何函数都将丢失 。sahibload~/.bashrc

如果希望定义的函数sahibload继续存在,请使用:

echo ". /home/myusername/sahiblib/sahibload" >> ~/.bashrc

更简单的例子

让我们考虑这个测试文件:

$ cat loader
#!/bin/sh
hello() { echo Hello; }

在执行脚本之前,没有任何函数hello

$ hello
bash: hello: command not found

执行脚本后,仍然没有名为的函数hello

$ ./loader
$ hello
bash: hello: command not found

在上面的 中,的执行方式与中的 的执行loader方式相同。sahibload~/.bashrc

现在,我们来查看并观察幸存loader的定义:hello

$ . ./loader
$ hello
Hello

sahibload需要在 中进行获取,而不是在 中进行执行~/.bashrc

相关内容