如何从 shell 脚本重新加载 /etc/environment
How to reload /etc/environment from shell script
所以我有这个 shell 脚本来检查然后将环境变量连接到 /etc/environment,然后重新加载文件而不必 logout/login:
#!/bin/sh
portvar="PORT=5000"
echo $portvar
grep -q $portvar /etc/environment && echo "EV already in" || echo $portvar >> /etc/environment
set -a; source /etc/environment; set +a;
当我 运行 它时,我收到错误 ./test.sh: 5: ./test.sh: source: not found
。但是,如果我 运行 set -a; source /etc/environment; set +a;
直接在终端中更新环境变量就好了。我不知道 set
命令的作用,我只是在另一个堆栈溢出问题中找到它。
知道为什么它 运行 直接在终端中而不是在 .sh 文件中吗?
谢谢
/bin/sh
在您的系统上可能是一些 shell 而不是 bash 并且没有实现 source
命令。在我的 Ubuntu 20.04 系统上 /bin/sh
实际上是 dash.
source
命令未被 POSIX 定义为 shell command language nor is it one of the required special built-in utilities. It's a non-standard feature provided by bash
. However, the .
command 的一部分,它做同样的事情,由 POSIX 指定。
因此您可以使用 .
,例如. /etc/environment
。或者,如果您想继续使用 source
,那么您需要通过 bash 或其他支持它的 shell 来获得您的脚本 运行,方法是将 shebang 行更改为 #!/bin/bash
.
有一个名为 checkbashisms 的工具可以帮助您发现脚本中对 bash 特定功能的无意使用。当你的脚本 运行 时,它会标记这个:
possible bashism in foo.sh line 5 (should be '.', not 'source'):
所以我有这个 shell 脚本来检查然后将环境变量连接到 /etc/environment,然后重新加载文件而不必 logout/login:
#!/bin/sh
portvar="PORT=5000"
echo $portvar
grep -q $portvar /etc/environment && echo "EV already in" || echo $portvar >> /etc/environment
set -a; source /etc/environment; set +a;
当我 运行 它时,我收到错误 ./test.sh: 5: ./test.sh: source: not found
。但是,如果我 运行 set -a; source /etc/environment; set +a;
直接在终端中更新环境变量就好了。我不知道 set
命令的作用,我只是在另一个堆栈溢出问题中找到它。
知道为什么它 运行 直接在终端中而不是在 .sh 文件中吗? 谢谢
/bin/sh
在您的系统上可能是一些 shell 而不是 bash 并且没有实现 source
命令。在我的 Ubuntu 20.04 系统上 /bin/sh
实际上是 dash.
source
命令未被 POSIX 定义为 shell command language nor is it one of the required special built-in utilities. It's a non-standard feature provided by bash
. However, the .
command 的一部分,它做同样的事情,由 POSIX 指定。
因此您可以使用 .
,例如. /etc/environment
。或者,如果您想继续使用 source
,那么您需要通过 bash 或其他支持它的 shell 来获得您的脚本 运行,方法是将 shebang 行更改为 #!/bin/bash
.
有一个名为 checkbashisms 的工具可以帮助您发现脚本中对 bash 特定功能的无意使用。当你的脚本 运行 时,它会标记这个:
possible bashism in foo.sh line 5 (should be '.', not 'source'):