这很奇怪。
所以我开发了一个叫做的东西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
。