在bashshell脚本中重新加载.profile(在unix中)?

在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

我是bashshell脚本的新手,遇到了一个挑战。我知道我可以通过执行以下操作重新加载“.profile”文件:

. .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-在某些情况下,命令的细节会有所不同]

  • 您是直接在终端中运行还是在脚本中运行
  • 如何在脚本中运行此操作
  • (广告1)

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

    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
    }