在bash脚本中,`source ~/.bash_profile`不起作用。

9
这是一个脚本,将bash文件移动到主页并使用source命令加载它。
# update.sh
#!/bin/bash
cp -f $PWD/bash_profile ~/.bash_profile
source ~/.bash_profile

它没用!它使用cp -f $PWD/bash_profile ~/.bash_profile更新文件。

~/.bash_profile中有一个新的PS1定义。文件已更新,但在打开新窗口之前没有发生任何更改。我需要在脚本执行后运行source ~/.bash_profile...

能否在Bash脚本中运行source命令?


如果你想要更新当前的shell,你需要引用这个bash脚本。 - 123
这是可能的,但出于与您在脚本中使用“source”而不是执行“.bash_profile”的相同原因,这是无用的。 - chepner
Shebang 必须是文件的第一行。 - glenn jackman
不是一个新的答案,而是一些澄清。当你在 source ~/.bash_profile 之后执行 echo "PS1=${PS1}",你会看到它已经被更改了。但是当你的脚本 update.sh 完成时,这些更改就会丢失。你可以使用 source 命令来保持这些更改在当前 shell 中有效。 - Walter A
2个回答

15

来源于MangeshBiradar 的这里:

使用. ./(点 空格 点 斜线)来执行Shell脚本

在使用“点 空格 点 斜线”来执行Shell脚本时,如下所示,将在当前shell中执行脚本而不是派生出子shell。

$ . ./setup.bash

换句话说,这会在当前shell中执行setup.bash文件中指定的命令,并为您准备好环境。


3
抱歉,仍然无法在Bash脚本中执行"source ~/.bash_profile"命令。 - Bilal Basharat
这是唯一对我有效的解决方案。即使在我执行了“bash”命令后重新启动了一个新的shell,也没有起作用。 - Melroy van den Berg

3
该 bash 脚本在其自己的 shell 实例中运行。当 shell 退出时,所有该新 shell 的环境变量(包括您的 PS1)都会被遗忘。注意:这是一个安全考虑因素--如果一个 shell 可以改变其调用者的环境,它可以通过别名化各种常用命令轻松地对该用户造成严重的损害。
但是,如果您运行 source update.sh,它将像用户自己输入命令一样运行这些命令。(或者您可以像 @JonathanMay 建议的那样使用 .,它也会做同样的事情)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接