【问题标题】:Error while trying set Environment variables in linux using shell script尝试使用 shell 脚本在 linux 中设置环境变量时出错
【发布时间】:2021-09-16 00:42:54
【问题描述】:

所以我正在尝试使用我的 shell 脚本设置环境变量。该脚本从用户那里获取一些输入,然后我必须在环境变量中设置这些输入。我同时使用了两个 shell 脚本,但出现权限被拒绝错误。

脚本 1

DEFAULT_NAME="sample"
read -p "Enter your Name: [$DEFAULT_NAME]: " USER_NAME
if [ -z "$USER_NAME" ]
then
    USER_NAME=$DEFAULT_NAME
else
    USER_NAME=$USER_NAME
fi
source setEnv.sh

脚本 2

echo -e "export NAME=${USER_NAME}" >> /etc/profile.d/nameenv.sh

【问题讨论】:

  • 您的第二个脚本必须以 root 身份运行,因为 /etc/profile.d/nameenv.sh 只能由 root 编写。
  • 正如 cmets 对 @David 的回答所指出的,这似乎是 XY Problem 的一个示例。没有人能弄清楚你要解决什么问题。请注意,在类似 UNIX 的操作系统(例如 Linux)中,环境变量对每个进程都是私有的,并且从它们的父进程继承。

标签: linux bash environment-variables


【解决方案1】:

首先,脚本 1 中的if 条件是错误的,您可能想改为测试$USER_NAME。 如果您使用 bash,则可以将整个 if 语句替换为:

USER_NAME=${USER_NAME:-$DEFAULT_NAME}

脚本 2 中,您确定每次执行脚本时都要在/etc/profile.d/nameenv.sh 中添加一个新行吗?最后一个声明将隐藏前面的声明。

最后,请注意您需要root 权限才能写入/etc/profile.d。您是否以特权用户身份运行脚本?

[编辑] 试图猜测你在这里尝试做什么。如果您需要为用户的当前会话(而不是系统范围)重新定义 USER_NAME,只需将 Script 1 中的最后一行替换为:

export USER_NAME

并删除 脚本 2。如果您想使其永久化(同样,仅适用于当前用户),请修改 Script 2 以改为在 ~/.bash_profile 中编写变量声明。

【讨论】:

  • 我已经编辑了脚本 1,现在只要用户运行脚本 1,环境变量就会更新到我想要的脚本 2。还有一种方法我们可以做到这一点而无需成为 root 用户或任何其他方法的帮助将不胜感激。
  • 这里需要一些上下文。你想达到什么目的? /etc/profile.d/ 中的文件不是用户特定的。您真的希望任何用户都能够为系统中的每个人重新定义USER_NAME
  • 所以基本上用户名只是一个例子,可以说我必须切换 DatabaseID 或类似的东西。
  • 问题当然不在于变量名,而在于谁(以及何时)应该受到变化的影响。如果脚本 2 允许 echo 执行此操作,那么 所有 用户(包括 root)在下次登录时将在其环境中具有新值。这真的是你想做的吗?当然,只有root 应该能够做到这一点......
  • 是的,你是对的,只有 root 用户才能这样做。还有什么方法可以在不重新登录的情况下反映环境变量的变化。
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2021-09-02
相关资源
最近更新 更多