bash - 使用 `env` 命令并通过文件传递环境变量的最佳方法

标签 bash shellcheck

我们目前有一个仅用于为以下参数/命令设置环境的命令。环境变量是通过一个简单的 cat 命令由文件设置的:

env $(cat "$1") <rest of the command>

但是,shellcheck似乎将此标记为“引用此内容以防止分词。shellcheck(SC2046)”。

处理此错误的最佳方法是什么,因为我不确定在这种特殊情况下简单地忽略它是否正确?据我所知,有多种路线可供选择(使用 xargs,遵循 "useless cat" 等原则)。

示例环境文件:

VARIABLE_1=TEST
VARIABLE_2=TEST2

更新

我希望社区就如何编写此类 .env 文件以及如何读取这些文件达成共识。文件和解释器都不应该比我们在命令之前内联的情况执行更多的魔术。

最佳答案

Shellcheck(像往常一样)提示缺少引号是正确的。如果值中嵌入了空格,则代码将会中断;如果它们包含 shell 通配字符,则代码可能会中断。

添加引号 ( env "$(< "$1")" ... ) 不起作用。它只会设置一个带有嵌入换行符的环境变量,这将使 env输出看起来很正确,但是 set类似的会表明这些值是错误的

一种安全且 Shellcheck 干净的方法是将文件的行读入数组并将每一行作为单独的参数传递给 env :

readarray -t settings <"$1"
env "${settings[@]}" ...

关于bash - 使用 `env` 命令并通过文件传递环境变量的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59353986/

相关文章:

linux - 是否可以将 "push"消息发送到事件的 bash 终端?

bash - 什么是 bash <<< 的 POSIX shell 等价物

bash - 在 bash 中拆分列表

shell - 从 RPM 规范文件中提取 shell 脚本以进行静态分析

bash - 为什么当源文件表示脚本顶部的变量时 shellcheck 会失败?

regex - 为什么使用星号通配符时命令 grep 不起作用 *

php - 从 php 触发 bash 脚本时,服务未执行

bash - 我如何回显/打印来自 bash 变量的特定行

bash - 这个错误是什么意思? (SC2129 : Consider using { cmd1; cmd2; } >> file instead of individual redirects.)