【问题标题】:Reload .profile in bash shell script (in unix)?在 bash shell 脚本(在 unix 中)中重新加载 .profile?
【发布时间】:2011-03-17 12:10:33
【问题描述】:

我是 bash shell 脚本的新手,遇到了一个挑战。我知道我可以通过以下方式重新加载我的“.profile”文件:

. .profile

但我正在尝试在我正在编写的 bash 脚本中执行相同的操作,但它无法正常工作。 有任何想法吗?我还能提供什么来澄清一下吗?

谢谢

【问题讨论】:

  • 正如 Ignacio 在下面指出的,您的脚本在子 shell 中运行。子shell不能修改主shell(子进程不能修改它的父进程)。因此,您需要使用“。”来“获取”脚本。命令(也可以拼写为“源”)。因此,如果您的脚本想要修改环境变量,您需要执行“source myscript”或“.myscript”之类的操作(它们的含义相同)。这将修改您的主 shell 的环境。 (我认为这就是你想要做的,如果这是错误的,请告诉我。)
  • 我从你的问题中得到了答案:)

标签: bash shell unix .bash-profile


【解决方案1】:

试试这个来重新加载你当前的shell:

source ~/.profile

【讨论】:

  • 您有其他解决方案吗?因为使用source 命令会将文件作为脚本运行...在最坏的情况下,如果有人在他们的 bash_profile 中使用像MyVar="$foo$MyVar" 这样的变量赋值,那么source ~/.profile 将给出最终结果MyVar="$foo$MyVar$MyVar",因此$MyVar 之后会有错误的值。 (不管有什么不好的做法,只要寻求替代解决方案)
【解决方案2】:

试试这个:

cd 
source .bash_profile

【讨论】:

    【解决方案3】:

    尝试重新加载/获取 ~/.profile 文件时会出现几个问题。 [这里指的是 Ubuntu linux - 在某些情况下,命令的细节会有所不同]

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

    广告。 1)

    直接在终端运行意味着不会创建子shell。所以你可以使用两个命令:

    source ~/.bash_profile
    

    . ~/.bash_profile
    

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

    Ad 2) 您可以通过调用

    来启动任何 bash 脚本
    sh myscript.sh 
    

    . myscript.sh
    

    在第一种情况下,这将创建一个不会影响系统环境变量的子shell,并且它们仅对子shell 进程可见。完成 subshel​​l 命令后,将不会应用任何导出等。 这是一个常见的错误,会导致很多开发人员浪费大量时间。

    为了使您在脚本中应用的更改对全局环境产生影响,脚本必须与

    一起运行
    .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 祝你好运!

    【讨论】:

      【解决方案4】:

      bash 脚本在单独的子shell 中运行。为了完成这项工作,您还需要获取其他脚本。

      【讨论】:

      • 我不确定(对所有这一切仍然是新手)您所说的“来源”-ing 另一个脚本到底是什么意思。可以请扩大一点。但是我尝试过: $ 。 ~/.profile $ 。 /etc/profile 没有成功。非常感谢。
      • @amirrustan:您的脚本需要获取您的.profile 文件,如下所示:. $HOME/.profile,您还需要通过获取它来启动您的脚本。类似. /path/to/yourscript
      • @amirrustam 请阅读superuser.com/questions/176783/…
      【解决方案5】:

      试试:

      #!/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 "$@"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多