• 締切済み
  • 困ってます

シェル変数(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
  • 閲覧数143
  • ありがとう数5

みんなの回答

  • 回答No.3

手元の環境にzsh入れて実験してみました。 結果、起動時の環境(csh)で、環境変数$PATHが設定されていると前者(/tmp/test.sh)と、設定されていないと後者(sudo su - hogehoge -c /tmp/test.sh)と同じ結果になりました。 起動時の環境がzshの場合は$PATHの有無に関係なく前者と同様の結果になっています。 このあたりにヒントがありそうですね。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

検証ありがとうございます。 zshの特性とかもあるんでしょうか? こうなるという事実はわかりましたが、理由がまだいまいちわかりません。

  • 回答No.2

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

参考URL:
http://zshwiki.org/home/config/files

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 デフォルトの$pathが違うのは、ご指摘の通りの理由ですが、私がわからないのは違う部分です。 test_config.sh で設定している path=($path /tmp) が、プロンプトからだとtest2.shまで保持されるのに su -c 経由ですと test2.sh まで保持されないのがなぜかがわからなくて困っています。

  • 回答No.1

所有者ユーザーとの違いじゃないような気がしますが。 sudo su - 所有者ユーザー -c /tmp/test.sh でやると分かる様な気がしますね。 コンソール上での実行かバックでの実行かの違い と、いう気がします。

共感・感謝の気持ちを伝えよう!

質問者からの補足

元の質問の hogehoge は所有者ユーザです。 バックと言うのはバックグラウンドでしょうか? 以下の二つを試しましたが、結果は変わりませんでした。 (1) & をつけてバックグラウンド実行 (2) .zshrc を退避させてから実行

関連するQ&A

  • 環境変数の設定(PATH)

    今、環境変数の設定(PATHの設定)を行っています。 OSは、RedHat9です。 スーパーユーザーのPATHは、 echo $PATHコマンドで見ると /usr/local/sbin:/usr/bin:/home/user1/test となっている。 しかし.bash_profileをみると PATHには、/usr/local/sbin:/usr/binしか 設定しておらず、 ユーザー(user1)の.bash_profileにも /home/user1/testをPATHに設定していない。 どこかでPATH設定を行っていると思いますが わかりません。 PATHの設定は、.bash_profileを設定するとは わかっているのですが、 スーパーユーザーの.bash_profileの記述と echo $PATHで見たPATHの構成がことなるのは なぜでしょうか? よろしくお願い致します。

  • パス(PATH)の設定ファイルについて

    OSはRed Hat Linux 9 を使用しております。 また、シェルはbashを使用しております。 ユーザがシステムにログインする際は、通常ですと /etc/profile ~/.bash_profile ~/.bash_login ~/.profile ファイルを読込、パス(PATH)の設定を行うと思いますが、 sshでrootユーザでシステムにログインした際は、 「echo $PATH」の結果は以下でした。 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/sbin su -で再度rootユーザでログインした際、もしくは、他ユーザからsu -でログインすると 「echo $PATH」の結果は以下でした。 /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin:/sbin ログインの仕方でパス(PATH)に違いがあります。 また、「/usr/local/bin」をパス(PATH)として設定している記述が 上記ファイルに見当たりません。 http://sakaguch.com/PastBBS/0038/B0018808.html http://oshiete1.goo.ne.jp/kotaeru.php3?q=800405 等のサイトを参考に、以下ディレクトリ配下を確認しましても /etc/profile.d /etc/rc.d/init.d /etc/rc.d/rc3.d 「/usr/local/bin」をパス(PATH)として設定している記述が 見当たりません。 ログインの仕方でパス(PATH)に何故違いがあるのか、 また「/usr/local/bin」をパス(PATH)として設定している記述がある ファイルをご存知の方ご教授頂きたく思います。 宜しくお願いします。

  • 環境変数PATH

    $PATHの中を変更したいです。 [root@****]# echo $PATH /usr/kerberos/sbin: /usr/kerberos/bin: /usr/local/bin: /bin:/usr/bin: /usr/java/jre1.6.0_14/bin: /home/takosu/bin: /usr/java/jre1.6.0_14/bin 「# echo $PATH」を行うと上記の様に表示されますが、 何故か「/usr/java/jre1.6.0_14/bin」が二つ表示されているので 一つを消したいんですが如何すれば良いでしょうか? ご回答宜しくお願い致します。

  • PATHについて

    PATH=/sbin:/usr/local/bin:/sbin となっていた場合、最後の/sbinを消したいときはどうすればよろしいでしょうか?

  • sshdコマンドへのpathの貼りかた

    Linuxに関して質問があります。ターミナルでsshdを入力すると、 [xyz@localhost ~]$ sshd bash: sshd: command not found と出ます。 echo $PATHをやると、 [xyz@localhost ~]$ echo $PATH /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/xyz/bin:/sbin とでます。 pathが通っていないのだと思うのですが、 .bash_profileに何と追記すれば良いのでしょうか?御教示下さい。宜しくお願い致します。

  • PATHの修正について(初心者)

    マックの環境をあるサイトを見ながら開発していたのですが、Apacheというwebサーバーをインストールしパスを通したところApacheの起動もできず、sudoやbrewなどのコマンドが使えなくなってしまいました。 その後、色々サイトを探してどうやらPATHを重複して通していることがわかりました。理解も浅はかな初心者がいろいろターミナルをいじっていたので、のっぴきならないくらいPATHが重複されてしまい、さらにunsetで重複したものを削除しようと試みたところ悪化をたどる一方で現在は何もコマンドができない状況です。 どうしたらもとに戻るのかどなたか解決の糸口を教えてください。よろしくお願いします。 参照URL ゼロから始めるMacintosh開発環境構築 http://engineer-intern.jp/archives/11563 現在のターミナルの状況... Last login: Mon Jun 23 19:09:16 on console -bash: unset: `PATH=/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:PATH': not a valid identifier -bash: unset: `PATH=/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:PATH': not a valid identifier -bash: unset: `PATH=/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:/usr/local/sbin:PATH': not a valid identifier

  • 環境変数pathについて

    環境変数pathについてお聞きしたいことがあります。たとえば /usr/local/bin:/bin:/usr/bin: このような場合、/usr/local/binと/binと/usr/binに入力されたコマンドのプログラム ファイルを探しに行くというような解釈をしているのですが、 /usr/local/binがあるならば/binや/usr/binといったようなpathは必要ないような気がします。なぜこのような書き方をするのでしょうか? お忙しいところ申し訳ございませんがよろしくお願いします。

  • Mac OpenGL FTGLが見つからない

    Macでプログラミングをしています。FTGLを入れたのですが、FTGL/ftgl.h: No such file or directoryとなってしまいます。なぜかわかりません。僕のやった流れを書いておきます。プログラミング初心者です。 最近FTGLが必要になったのでmacportを使ってFTGLを導入。 $ sudo port install ftgl macportを使うのは初めて。どうやらFTGLはopt/local/include/に入った模様。 そこでpathの変更をし確認 echo $PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/include (通らなくて変更しまくったので乱立してますが) パスは通っている模様? プログラミングを書いてincludeは以下の通り #include <FTGL/ftgl.h> さてコンパイル、terminalに cc project2.c -o project2 -framework OpenGL -framework GLUT -lobjc と打つと project2.c:9:23: error: FTGL/ftgl.h: No such file or directory 確かにopt/local/includeにはFTGLというフォルダがあってftgl.hが入っているのですがなぜでしょうか? 基本的なミスをしている可能性が高いと思います。また、足りない情報があれば付け加えます。回答お待ちしております。

  • パスがうまく通らないので、パスについて教えてください。

    パスがうまく通らないので、パスについて教えてください。 ▽やりたいこと http://okwave.jp/qa/q6132108.html ▽知りたいこと  →パスを通すとは、具体的に、どこのことを指すのでしょうか? 1)php infoのinclude_path(ブラウザで確認) Configuration PHP Core include_path .:/usr/local/lib/php 2)php infoのPATH(ブラウザで確認) Environment Variable Value PATH /command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin 3)echo $PATH(SSHで確認) 出力すると、1)とも2)とも異なる結果となります…。 パスを通すとは、具体的に、どこのことを指すのでしょうか? また、上記それぞれの意味、及び内容が違う理由を、教えてください。

    • ベストアンサー
    • PHP
  • macportsの環境変数

    macportsをインストールし、環境変数のPATHを export PATH=/opt/local/bin:/opt/local/sbin:$PATH と入力した後すぐにenvを入れるときちんと変更が保存されてるように見えるのですが、ターミナルを再起動しenvで確認すると毎回変更前の設定に戻っています。 どのようにすればこのPATHの変更を今後全てのターミナルウィンドウに反映する事が出来ますか?

    • 締切済み
    • Mac