当您运行“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