【问题标题】:System environment variables not accessible in bash script在 bash 脚本中无法访问系统环境变量
【发布时间】:2018-11-01 16:28:41
【问题描述】:

我在适用于 Linux 的 Windows 子系统上运行 Ubuntu,并且我想要运行一个需要访问系统环境变量的 bash 脚本。具体来说,我使用以下命令在我的系统上定义了一个环境变量:

export SLACK_LEGACY_API_TOKEN="Insert Token Here"

然后我定义一个名为 slack.sh 的文件,如下所示:

#!/usr/bin/env bash
echo $SLACK_LEGACY_API_TOKEN

然后我用source ./slack.sh 运行这个脚本。当我运行这个命令时,它只是打印出一个空行——它没有得到环境变量的值。

我在 .sh 文件中尝试了不同的语法来引用环境变量,例如 "$SLACK_LEGACY_API_TOKEN"${SLACK_LEGACY_API_TOKEN},但结果相同。我还使用/slack.sh. ./slack.sh 运行了脚本,但结果相同。

如何让我的脚本看到$SLACK_LEGACY_API_TOKEN

【问题讨论】:

  • slack.shslack_delete.sh 是不同的文件吗?
  • 如果 slack.sh 以 DOS 行结尾保存,那么您正在尝试扩展变量 SLACK_LEGACY_API_TOKEN\r,而不是 SLACK_LEGACY_API_TOKEN(其中 \r 表示 CR/LF 的回车对终止行)。
  • 通过在脚本内部运行 env 或在行中附加一些其他字符(例如,echo $SLACK_LEGACY_API_TOKEN x)来确认环境变量是否存在,这会将变量名称与CR/LF 对。使用echo ${SLACK_LEGACY_API_TOKEN} 也应该足以防止变量名被“污染”。
  • 我在我的 WSL 上进行了尝试,但我没有使用编辑器,而是在 nano 中编写了 slack.sh,我看到了值。我猜@chepner 关于 CR/LF 结尾是正确的,这可能是根本原因。另外,如果您想使用此变量,最好将其放在~/.bashrc 文件中,如果您下次需要访问它。
  • @Shan-Desai 在.bash_profile中定义环境变量once是比较常见的,基于启动一个其他交互shell继承的登录shell的常见用法他们的环境。

标签: linux bash sh windows-subsystem-for-linux


【解决方案1】:

正如@chepner 在我的问题中的 cmets 中提到的,问题是由在我的 Windows 环境中定义 .sh 文件引起的。这导致文件以 DOS 行结尾保存,这导致脚本出现问题。完全在 Linux 环境中重新定义文件解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2021-01-09
    相关资源
    最近更新 更多