
「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
ここで表示されているのは、コマンドが実行される前に、引数処理中に最初のユーザーのシェルで が展開されるという事実です。su(1)
そのため、常にそうなっているように見えます。ハード引用符 ( ) を使用すると、'echo $PATH'
異なる表示になるはずです。または、 とだけ実行してください\$
。
$PATH
これにより、コマンドが実行されるまで構文が保持されますsu(1)
。通常は環境を変更しませんが、新しいシェルを起動するため、PATH=
さまざまなシェル起動スクリプトの行を確認する必要があります。
オプションがsu(1)
あるので-c
、Linux を使用しているようです。Mac または BSD では、PATH
ログインの代わりに簡略化されたログインが表示されますPATH
が、それでも「PATH をいつ拡張しましたか?」という同じ問題が発生します。
答え2
su -
または を使用するとsu -l
、ログイン セッションがエミュレートされ、環境がクリーンな状態にリセットされます。
Arch Linux では、su -
ハードコードされた文字列を/usr/ucb:/bin:/usr/bin:/etc
新しい として使用します。他のシステムでは、から$PATH
読み取ったり、PAM に依存して環境を設定したりする場合があります。ENV_SUPATH
/etc/login.defs
su ... "echo $PATH"
は、が起動される$PATH
ずっと前に、現在のシェルによってその部分が展開されるため、 ではありません。代わりに (一重引用符に注意)、または(完全な環境を出力) を使用してください。su
su ... 'echo $PATH'
su - -c env