linux 中使用 su 的变量行为

Behavior of variables using su in linux

我正在将 Poetry 安装在 dockerfile 中,但我想在不同的用户下进行(以便与 VSCode 很好地配合)。不过,我不明白 su 命令的行为。

当我 运行 su vscode -c "echo $HOME" 我得到 /root。但是,当我 运行 su vscode,随后 运行 echo $HOME,我得到 /home/vscode`。

更奇怪的是,当我 运行 su vscode -c "echo $HOME && curl -sSL https://install.python-poetry.org | python3" 时,我得到 /root 作为第一个命令的输出,但诗歌被安装到 /home/vscode/.local/bin。我在这里不知所措...有人可以对此有所启发吗?

"echo $HOME" 由您当前的 shell su 执行之前评估。所以 su 只会作为参数 "echo /root" (already-evaluated) 传递。如果您希望变量由 su 生成的 shell 求值,则需要对其进行转义:'echo $HOME'

参见 POSIX 规范中的 2.2 Quoting