![当您运行“su -c”时环境会发生什么情况?](https://linux22.com/image/1251857/%E5%BD%93%E6%82%A8%E8%BF%90%E8%A1%8C%E2%80%9Csu%20-c%E2%80%9D%E6%97%B6%E7%8E%AF%E5%A2%83%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%EF%BC%9F.png)
当您运行“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 扩展了。请使用(请注意单引号)或(打印完整环境)。su
su ... 'echo $PATH'
su - -c env