【问题标题】:How to reload /etc/environment from shell script如何从 shell 脚本重新加载 /etc/environment
【发布时间】:2020-10-24 09:18:44
【问题描述】:

所以我有这个 shell 脚本,它检查环境变量并将其连接到 /etc/environment,然后重新加载文件而无需注销/登录:

#!/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 文件中运行吗? 谢谢

【问题讨论】:

  • 这适用于我在 Windows 中的原样或使用点而不是源。您可以尝试将其作为 sh your_script.sh 运行吗?你在哪个操作系统上运行它?

标签: linux bash ubuntu environment-variables sh


【解决方案1】:

您系统上的/bin/sh 可能是一些不是 bash 并且没有实现 source 命令的 shell。在我的 Ubuntu 20.04 系统上,/bin/sh 实际上是 dash

source 命令未被 POSIX 定义为shell command language 的一部分,也不是必需的special built-in utilities 之一。这是bash 提供的非标准功能。但是,做同样事情的the . command 是由 POSIX 指定的。

所以你可以改用.,例如. /etc/environment。或者如果你想继续使用source,那么你需要让你的脚本由bash或其他支持它的shell运行,方法是将shebang行更改为#!/bin/bash

有一个名为 checkbashisms 的工具可以帮助您在脚本中发现无意使用 bash 特定功能。在您的脚本上运行时,它会标记以下内容:

possible bashism in foo.sh line 5 (should be '.', not 'source'):

【讨论】:

  • 完美。使用.
  • @hamncheez:- 你是怎么解决这个问题的?最后一行是否应该设置-a; . /etc/环境;设置+a; IE。 '。'而不是“来源”?因为。 /etc/environment 不适合我?
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 2017-02-04
  • 2017-04-14
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多