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

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或任何文件,可在此处找到

Joh*_*024 5

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

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.