在bashshell脚本中重新加载.profile(在unix中)?
我是bashshell脚本的新手,遇到了一个挑战。我知道我可以通过执行以下操作重新加载“.profile”文件:在bashshell脚本中重新加载.profile(在unix中)?,bash,shell,unix,.bash-profile,Bash,Shell,Unix,.bash Profile,我是bashshell脚本的新手,遇到了一个挑战。我知道我可以通过执行以下操作重新加载“.profile”文件: . .profile 但是我试图在我正在编写的bash脚本中执行同样的操作,但它不起作用。 有什么想法吗?还有什么我可以澄清的吗 谢谢,bash脚本在单独的子shell中运行。为了使这项工作正常进行,您还需要为其他脚本提供源代码。尝试: #!/bin/bash # .... some previous code ... # help set exec | less set -- 1
. .profile
但是我试图在我正在编写的bash脚本中执行同样的操作,但它不起作用。
有什么想法吗?还有什么我可以澄清的吗
谢谢,bash脚本在单独的子shell中运行。为了使这项工作正常进行,您还需要为其他脚本提供源代码。尝试:
#!/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 "$@"
尝试以下操作以重新加载当前shell:
source ~/.profile
试试这个:
cd
source .bash_profile
尝试重新加载/source~/.profile文件时会出现几个问题。 [这是指Ubuntu linux-在某些情况下,命令的细节会有所不同]
source ~/.bash_profile
或
在这两种情况下,这将使用.profile文件的内容更新环境
Ad 2)您可以通过调用
sh myscript.sh
或
在第一种情况下,这将创建一个子shell,该子shell不会影响系统的环境变量,并且它们将仅对子shell进程可见。完成subshell命令后,将不会应用任何导出等。
这是一个常见的错误,会导致许多开发人员损失大量时间。
为了使脚本中应用的更改对全局环境生效,必须使用
.myscript.sh
指挥部
为了确保脚本没有在subshel中运行,可以使用此函数。(同样的例子是Ubuntu shell)
我希望这能消除一些常见的误解D
祝你好运 我不确定(对这一切还是陌生的)你所说的“源代码”到底是什么意思,也不确定你在使用另一个脚本。请再详细说明一下。但是我尝试过:$。~/。个人资料$/etc/profile没有成功。非常感谢。@Amirustan:您的脚本需要将
.profile
文件的源代码如下:$HOME/.profile
,您还需要通过寻找资源来启动脚本。类似于/path/to/yourscript
@amirrustam请阅读下面Ignacio指出的内容,您的脚本正在子shell中运行。子shell不能修改主shell(子进程不能修改其父进程)。因此,您需要使用“.”命令(也可以拼写为“source”)来“source”脚本。因此,如果您的脚本想要(比如)修改环境变量,您需要执行类似于“sourcemyscript”或“.myscript”的操作(它们的含义相同)。这将修改主shell的环境。(我想这就是你想做的,如果这是错误的,请告诉我。)我从你的问题中得到了答案:)你有其他解决方案吗?因为使用source
命令会将文件作为脚本运行。。。在最坏的情况下,如果有人在他们的bash_配置文件中使用变量赋值,如MyVar=“$foo$MyVar”
,那么source~/.profile
将给出最终结果MyVar=“$foo$MyVar$MyVar”
,因此$MyVar
之后会有错误的值。(不管不良做法如何,只要寻求替代解决方案即可)
. myscript.sh
.myscript.sh
#/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
}