在bash shell脚本中重新加载.profile(在UNIX中)?


130

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

. .profile

但是我试图在我正在编写的bash脚本中执行相同的操作,但这只是不起作用。有任何想法吗?我还有什么要澄清的吗?

谢谢


正如Ignacio在下面指出的那样,您的脚本在子外壳中运行。子外壳程序无法修改主外壳程序(子进程无法修改其父进程)。因此,您需要使用“”来“获取”脚本。命令(也可以拼写为“源”)。因此,如果您的脚本想要修改环境变量,则需要执行诸如“ source myscript”或“ .myscript”之类的操作(它们都意味着同一件事)。这将修改您的主外壳环境。(我想这是您要尝试执行的操作,如果这是错误的,请让我知道。)
bstpierre 2010年

1
我从您的问题中得到了答复:)
Kolob Canyon

Answers:


195

尝试执行以下操作以重新加载当前的shell:

source ~/.profile

1
您有替代解决方案吗?因为使用source命令将文件作为脚本运行...在最坏的情况下,如果有人MyVar="$foo$MyVar"在他们的bash_profile中使用变量赋值,source ~/.profile则会给出最终结果MyVar="$foo$MyVar$MyVar",因此$MyVar之后的值将错误。(无论不良做法如何,都请寻求替代解决方案)
Jeffrey Mvutu Mabilama '18年


5

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

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

广告。1)

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

source ~/.bash_profile

要么

. ~/.bash_profile

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

广告2)您可以通过调用以下命令来启动任何bash脚本

sh myscript.sh 

要么

. myscript.sh

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

为了使您在脚本中应用的更改对全局环境生效,必须与该脚本一起运行

.myscript.sh

命令。

为了确保您的脚本未在子平台中运行,可以使用此功能。(同样的例子是针对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中运行。为了使这项工作有效,您还需要提供其他脚本。


我不确定(对于所有这些仍然是新知识)您通过“源”输入其他脚本的确切含义。请扩大一点。但是我试过了:$。〜/ .profile $。/ etc / profile没有成功。非常感谢。
阿米尔·鲁斯塔姆扎德

1
@amirrustan:您的脚本将需要.profile像这样来获取文件:. $HOME/.profile并且您还需要通过采购来启动脚本。有点. /path/to/yourscript
暂停,直到另行通知。


1

尝试:

#!/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 "$@"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.