在Unix中的Bash shell脚本中重新加载.profile文件?

152

我刚接触bash shell脚本编程,面临一个挑战。我知道只需要执行以下操作就可以重新加载我的“.profile”文件:

. .profile

但是我正在尝试在我写的bash脚本中执行相同的操作,但它就是不起作用。 有什么想法吗? 我可以提供什么其他信息来澄清问题吗?

谢谢


正如Ignacio在下面指出的那样,您的脚本正在子shell中运行。 子shell不能修改主shell(子进程无法修改其父进程)。 因此,您需要使用“.”命令(也可以拼写为“source”)来“源化”脚本。 因此,如果您的脚本想要修改环境变量,您需要执行类似于“source myscript”或“. myscript”的操作(它们都表示相同的意思)。 这将修改您的主要shell环境。 (我认为这就是您想做的事情,如果我说错了,请告诉我。) - bstpierre
1
我从你的问题中得到了答案 :) - Kellen Stuart
无论是source .bash_profile还是. ./.bash_profile都会返回"bash: .: 是一个目录"的错误提示。 - Heinz
5个回答

254

尝试使用以下命令重新加载当前的shell:

source ~/.profile

1
你有其他解决方案吗?因为使用source命令会将文件作为脚本运行...在最坏的情况下,如果有人在他们的bash_profile中使用变量赋值,例如MyVar="$foo$MyVar",那么source ~/.profile将给出最终结果MyVar="$foo$MyVar$MyVar",因此$MyVar之后的值将是错误的。(不管好坏实践,只是询问其他解决方案) - Jeffrey Mvutu Mabilama

11

当尝试重新加载/源化~/.profile文件时,会出现一些问题。

[这是指Ubuntu linux-在某些情况下,命令的细节可能会有所不同]

  1. 您是在终端直接运行还是在脚本中运行?
  2. 如何在脚本中运行此命令?

答案1)

在终端直接运行意味着不会创建子shell。因此,您可以使用以下两个命令之一:

source ~/.bash_profile

或者

. ~/.bash_profile

在这两种情况下,这将使用.profile文件的内容更新环境。

第2点)您可以通过调用任何bash脚本来启动它。

sh myscript.sh 

或者

. myscript.sh

在第一种情况下,这将创建一个子shell,不会影响您系统的环境变量,它们只对子shell进程可见。在完成子shell命令后,所有导出等都不会应用。 这是一个常见的错误,会导致许多开发人员浪费很多时间。
为了使您在脚本中进行的更改对全局环境产生影响,必须使用以下方式运行脚本:
.myscript.sh

命令。

为了确保您的脚本不在子shell中运行,您可以使用此函数。(以下示例适用于Ubuntu shell)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

我希望这能消除一些常见的误解! :D 祝好运!


11

试一试:

cd 
source .bash_profile

返回“bash: .: 是一个目录” - Heinz

4

这个 bash 脚本在一个独立的子 shell 中运行。为了让它正常工作,你需要同时引用另外一个脚本。


我还不太确定(对这一切还很新)你所说的“source”另一个脚本是什么意思。能否再详细解释一下? 不过,我已经尝试过以下命令:$ . ~/.profile $ . /etc/profile但都没有成功。非常感谢。 - Amir Rustamzadeh
1
@amirrustan:你的脚本需要像这样引用你的.profile文件:. $HOME/.profile,并且你需要通过引用它来启动你的脚本。就像这样:. /path/to/yourscript - Dennis Williamson
1
@amirrustam 请阅读 http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-script/176788#176788 - Lesmana

2

尝试:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"

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