如何删除环境变量的“SC2154”警告[关闭]

Posted

技术标签:

【中文标题】如何删除环境变量的“SC2154”警告[关闭]【英文标题】:How can I remove the "SC2154" warning for environment variables [closed] 【发布时间】: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 这样的全局位置。 【参考方案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 在上面的评论中指出的那样,该变量也经常用于小写变体。事实上,this 和 this 文章说要使用 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 想要的。

以上是关于如何删除环境变量的“SC2154”警告[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将 Visual Studio 2005 sln 迁移到 2008,在 LIB 环境变量中使用 vc98 路径发出警告,如何解决?

如何彻底删除hive以及配置好的环境变量

windows环境中Theano警告没有检测到g++的解决方法

liunx 中如何删除export设置的环境变量

如何恢复已删除的环境变量?

如何添加环境变量或路径添加到系统的Path里面