如何删除环境变量的“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'
总是打印 xxx
而bash -c 'set -eu; echo foobar; echo xxx'
打印 xxx
当且仅当设置了foobar
。我认为后者正是 OP 想要的。以上是关于如何删除环境变量的“SC2154”警告[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
将 Visual Studio 2005 sln 迁移到 2008,在 LIB 环境变量中使用 vc98 路径发出警告,如何解决?