「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ここで表示されているのは、コマンドが実行される前に、引数処理中に最初のユーザーのシェルで が展開されるという事実です。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ずっと前に、現在のシェルによってその部分が展開されるため、 ではありません。代わりに (一重引用符に注意)、または(完全な環境を出力) を使用してください。susu ... 'echo $PATH'su - -c env

関連情報