运行“su -c”时环境会发生什么变化?

tts*_*ras 4 unix bash sh su

运行“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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

use*_*686 7

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

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

su ... "echo $PATH"谎言,因为该$PATH部分已由您当前的外壳扩展,在su启动之前。使用su ... 'echo $PATH'替代(注意单引号),或su - -c env(打印出完整的环境)。