在 bash shell 脚本中重新加载配置文件(在 unix 中) ?

我是 bash shell 脚本编程的新手,遇到过一个挑战。我知道我可以重新装弹。只需按以下步骤:

. .profile

但是我尝试在我正在编写的 bash 脚本中执行相同的操作,但是它不起作用。 有什么想法吗,还有什么我可以澄清的吗?

谢谢

207742 次浏览

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. 您是直接在终端还是在脚本中运行它?
  2. 如何在脚本中运行它?

广告1)

直接在终端中运行这个命令意味着不会创建子 shell:

source ~/.bash_profile

或者

. ~/.bash_profile

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

Ad2)您可以通过调用

sh myscript.sh

或者

. myscript.sh

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

为了使脚本中应用的更改对全局环境有效,必须使用该脚本运行

.myscript.sh

指挥官。

为了确保脚本不是在 subshel 中运行,可以使用这个函数。(同样的例子是 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
}

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