如何从 shell 脚本获取 .bashrc

如何从 shell 脚本获取 .bashrc

我有一个 bash 脚本script.sh,其中包含以下行:

sudo -u myusername sh ~/.profile

我可以从 shell 中调用,source ~/.profile但这在脚本中不起作用,而此命令可以。它强制我当前的 shell 读取我的~/.profile

但是,我的~/.profile包含以下几行:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

因为它应该来源我的~/.bashrc.但是,当我运行时,script.sh出现以下错误:

/home/username/.profile: 24: /home/username/.profile: source: not found

是否可以~/.bashrc从 my ~/.profile(本身是从另一个脚本调用的)获取我的文件而不更改 my~/.bashrc或 my ~/.profile

script.sh会下载我的~/.profile~/.bashrc文件并将它们放在正确的位置,因此我想在script.sh下载这些文件后从内部获取这些文件,并让它们影响我用来运行的 shell 会话script.sh

答案1

该错误来自于尝试使用 执行~/.profile文件sh,该文件不理解sourcesh使用.(dot) 代替,它也适用于bash和所有其他 POSIX shell)。

此外,执行~/.profile不会设置该文件在执行它的 shell 中设置的环境变量。这是因为它在自己的子 shell 中运行。

子 shell(这是您执行~/.profile而不是获取它时得到的)永远不会影响父 shell(您从中执行脚本的 shell)的环境。因此,除非您在文件中设置变量,否则您不能~/.profile期望它们在脚本中设置。source

运行sudo source ~/.profile在这里没有帮助,因为sudo它是当前 shell 的子进程。


相关的额外信息:

要为未从交互式 shell 运行的脚本设置环境(其中~/.profile~/.bashrc已获取源代码),请BASH_ENV在调用脚本时将变量设置为相应的文件。这将在将控制权移交给脚本之前使bash源代码成为文件。$BASH_ENV

例如:

BASH_ENV="$HOME/.profile" "$HOME/scripts/myscript.sh"

这是仅有的如果从非交互式 shell 会话(例如 cron 作业)调用脚本,并且需要访问设置的环境变量~/.profile或源文件中的任何文件,则这是必要的~/.profile

在交互式 shell 会话中,BASH_ENV不必以这种方式设置变量,并且脚本不需要获取~/.bashrc~/.profile因为这些已经获取。

相关内容