- 締切済み
シェル変数(path)の挙動がわかりません
シェル変数の挙動がわからなくて困っています。 以下のような3ファイルがあります。 % cat /tmp/test_config.sh #!/opt/local/bin/zsh path=($path /tmp) % cat /tmp/test.sh #!/opt/local/bin/zsh . /tmp/test_config.sh echo $PATH echo $path /tmp/test2.sh % cat /tmp/test2.sh #!/opt/local/bin/zsh echo $PATH echo $path which test.sh これを、所有者のユーザで実行するのとsu -c で実行するので挙動が変わります。 % /tmp/test.sh /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /tmp/test.sh % sudo su - hogehoge -c /tmp/test.sh /bin:/usr/bin:/usr/ucb:/usr/local/bin:/tmp /bin /usr/bin /usr/ucb /usr/local/bin /tmp /bin:/usr/bin:/usr/ucb:/usr/local/bin /bin /usr/bin /usr/ucb /usr/local/bin test.sh not found この挙動の違いは、何から産まれるんでしょう? .zshrc でそういう設定ができるんでしょうか? .zshenv は使ってません。 (なお、環境変数$PATHを使えば目的は果たせると言うのはわかっています)
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Toshi0230
- ベストアンサー率51% (836/1635)
手元の環境にzsh入れて実験してみました。 結果、起動時の環境(csh)で、環境変数$PATHが設定されていると前者(/tmp/test.sh)と、設定されていないと後者(sudo su - hogehoge -c /tmp/test.sh)と同じ結果になりました。 起動時の環境がzshの場合は$PATHの有無に関係なく前者と同様の結果になっています。 このあたりにヒントがありそうですね。
- Toshi0230
- ベストアンサー率51% (836/1635)
zshは使ったことないですが、シェル変数は起動するシェルごとに異なる値をとりうる、という点はよろしいですか? であれば、デフォルトの$path設定とプロンプト時の$path設定が.zshrc内で異なるように設定すれば、質問文と同じようなことは実現可能です。 少なくともcsh系では設定できますので。 …ちと気になって調べてみたんですが、zshwikiに以下の記述があったので、 "% sudo su - hogehoge -c /tmp/test.sh"で起動したほうは、たぶん .zshrcが読み込まれていませんね。その辺が違いの原因でしょう。 > zshrc / / .zshrc > * read after zprofile, if the shell is an interactive shell
お礼
ありがとうございます。 デフォルトの$pathが違うのは、ご指摘の通りの理由ですが、私がわからないのは違う部分です。 test_config.sh で設定している path=($path /tmp) が、プロンプトからだとtest2.shまで保持されるのに su -c 経由ですと test2.sh まで保持されないのがなぜかがわからなくて困っています。
- justraver
- ベストアンサー率30% (62/201)
所有者ユーザーとの違いじゃないような気がしますが。 sudo su - 所有者ユーザー -c /tmp/test.sh でやると分かる様な気がしますね。 コンソール上での実行かバックでの実行かの違い と、いう気がします。
補足
元の質問の hogehoge は所有者ユーザです。 バックと言うのはバックグラウンドでしょうか? 以下の二つを試しましたが、結果は変わりませんでした。 (1) & をつけてバックグラウンド実行 (2) .zshrc を退避させてから実行
お礼
検証ありがとうございます。 zshの特性とかもあるんでしょうか? こうなるという事実はわかりましたが、理由がまだいまいちわかりません。