当您运行“su -c”时环境会发生什么情况?

当您运行“su -c”时环境会发生什么情况?

当您运行“su -c”时环境会发生什么情况?

我问这个问题的原因是这种神秘的行为:

bash$ which firefox
/usr/local/bin/firefox
bash$ su - user -c "echo $PATH"
bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:... 
bash$ su - user -c "firefox ..."
-bash: firefox: command not found

有任何想法吗?

答案1

您看到的是,在命令运行$PATH之前,在参数处理期间,第一个用户 shell 中会展开,su(1)因此看起来它总是会展开。如果您使用硬引号 ( 'echo $PATH'),则应该会看到不同的内容,或者只需执行\$

这将保留$PATH语法直到su(1)命令运行完毕。虽然它通常不会摆弄环境,但它会启动一个新的 shell,因此您应该检查PATH=各个 shell 启动脚本中的行。

su(1)有一个-c选项,所以您似乎是在 Linux 上。在 Mac 或 BSD 上,您会得到一个简化的PATH登录界面,PATH但您仍然会遇到相同的“我什么时候扩展了 PATH?”问题。

答案2

当使用su -su -l时,它会模拟登录会话,其中涉及将环境重置为干净状态。

在 Arch Linux 上,su -使用硬编码字符串/usr/ucb:/bin:/usr/bin:/etc作为新的$PATH。在其他系统上,它可能ENV_SUPATH从读取/etc/login.defs,或依赖 PAM 来设置环境。

su ... "echo $PATH"谎言,因为该部分在启动$PATH之前就被当前 shell 扩展了。请使用(请注意单引号)或(打印完整环境)。susu ... 'echo $PATH'su - -c env

相关内容