【问题标题】:How can I remove the "SC2154" warning for environment variables [closed]如何删除环境变量的“SC2154”警告[关闭]
【发布时间】:2020-09-14 02:45:06
【问题描述】:

如何在 linting shell 脚本时删除 shellcheck 的警告“SC2154”?

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

echo "proxy=$http_proxy" | sudo tee -a /etc/test.txt

警告是“SC2154:http_proxy 已被引用但未分配”。

编辑: 我想使用 sudo 将环境变量“http_proxy”写入 test.txt 文件。

【问题讨论】:

  • 不清楚,为什么你在回声中再次打印http_proxy?请明确您的问题,让我们知道您在这里实际想要实现的目标是什么?
  • @user5580578 :我看不到您会在脚本中的任何位置写入变量http_proxy。我什至看不出它为什么会是一个 environment 变量(除非它已被父进程导出)。
  • @user5580578 :在 this 脚本中删除空格作为有效的IFS 有什么意义?我看不出这会在哪里产生影响。
  • @user1934428 http_proxy 是环境变量非常普遍。
  • @user1934428 我经常看到它小写和大写一样,而且它经常被导出到像 .profile 或 .bashrc 这样的全局位置。

标签: bash shell lint shellcheck


【解决方案1】:

正如wiki page of the warning 中的详细描述,您尝试使用(可能)未初始化的变量$http_proxy

您可以suppress any warning评论:

# shellcheck disable=SC2154
echo "proxy=$http_proxy" | ...

但是,更好的解决方案是修复脚本。在这里,您似乎假设 http_proxy 是一个环境变量。如果是这种情况,您应该遵守命名约定并将其命名为HTTP_PROXY。 Shellcheck 遵守此约定,不会显示警告。

【讨论】:

  • 我也会直观地为HTTP_PROXY 使用大写,但正如用户@JosephSible-ReinstateMonica 在上面的评论中指出的那样,该变量也经常用于小写变体。事实上,thisthis 文章说要使用 http_proxy。毕竟,这取决于实际使用该变量的应用程序,以及预期的拼写。
【解决方案2】:

除了抑制警告之外,如果 http_proxy 为 null 或未设置,您可以将其显式扩展为空:

echo "proxy=${http_proxy:-}"

【讨论】:

  • 我认为这会改变脚本的行为(参见set -u pipefail)。也许您可以插入if,但我不确定这是否会修复警告。
  • @Socowi:为什么?在参数扩展中使用:- 不会影响echo 的退出代码。 echo 只会输出一个换行符。
  • @user1934428 在set -e 下运行shell 脚本时,未设置的扩展变量将导致脚本退出。因此,如果未设置 http_proxy,则 OP 可能打算退出脚本。此解决方案具有不同的行为 - 如果未设置变量,则将其替换为空。
  • @KamilCuk :是的,但使用:- 会抑制这一点。您可以使用set -e; echo ${foobar:-}; echo xxx 进行尝试。这就是为什么我反对 Socowi 的说法,即您的解决方案会改变行为。
  • @user1934428 -u 在您的示例中也很重要:bash -c 'set -eu; echo ${foobar:-}; echo xxx' 总是打印 xxxbash -c 'set -eu; echo foobar; echo xxx' 打印 xxx 当且仅当设置了foobar。我认为后者正是 OP 想要的。
猜你喜欢
  • 2015-04-23
  • 2011-10-16
  • 1970-01-01
  • 2022-11-05
  • 2021-04-28
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多