Ini*_*hib 2 command-line bash scripts bashrc source
这很奇怪。
所以我开发了这个叫做的东西SahibLib,它基本上是一个脚本,你可以从中获取大量其他脚本。
它的目录树如下所示:
/home
|- /home/myuser
|- /home/myuser/sahiblib
|- sahibload <- executed in ~/.bashrc
|- sahiblib <- executed by sahibload
|- modules
|- core.sls <- problem file
|- example.sls <- problem file
Run Code Online (Sandbox Code Playgroud)
SahibLib应该做的是获取.sls文件。但它不会那样做。
它输出正确的消息(“[SUCCESS]Thank you and goodbye.”),但实际文件没有来源。
myuser@mypc:~$ slhelp
Invalid command.
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我手动获取文件时,它可以工作:
myuser@mypc:~$ . ~/.bashrc
[SUCCESS] Thank you and goodbye.
myuser@mypc:~$ slhelp
SahibLib Core Help
...
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么脚本没有在 ~/.bashrc 中正确执行?
更新:向 写入一些调试命令core.sls,该文件似乎完美执行。它到达文件的末尾,并返回一个标准的退出代码。这让问题变得更加奇怪,因为现在看来 Bash 只是完全忽略了函数定义。此外,如果您需要查看core.sls或任何文件,可在此处找到
从您的链接中,在该页面底部附近,我看到了这一行:
echo "/home/myusername/sahiblib/sahibload" >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
这表明,当~/.bashrc运行时,它将执行 sahibload,而不是源它。这意味着sahibload当执行sahibload完成并且控制返回到时,由 定义的任何函数 都将丢失 ~/.bashrc。
如果您希望由定义的函数sahibload继续存在,请使用:
echo ". /home/myusername/sahiblib/sahibload" >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
让我们考虑这个测试文件:
$ cat loader
#!/bin/sh
hello() { echo Hello; }
Run Code Online (Sandbox Code Playgroud)
在执行脚本之前,没有函数hello:
$ hello
bash: hello: command not found
Run Code Online (Sandbox Code Playgroud)
在我们执行脚本后,仍然没有名为 的函数hello:
$ ./loader
$ hello
bash: hello: command not found
Run Code Online (Sandbox Code Playgroud)
在上面,loader执行的方式与sahibload中的执行方式相同~/.bashrc。
现在,让我们找出loader并观察hello生存的定义:
$ . ./loader
$ hello
Hello
Run Code Online (Sandbox Code Playgroud)
sahibload需要在~/.bashrc.