• ベストアンサー

solarisのsetenvが無効

shell 記述したsetenvが無効になります。 プロンプトから打ち込むとOKなのですが、 test.sh shellに ---------------------------------------------- #!/bin/csh setenv 環境変数 環境変数パス ---------------------------------------------- などと記述し、sh test.sh でプロンプトから 実行したときのsetenvでは無効になります。 root ではなく、通常ユーザなので、管理者が 制限をしているのかもしれませんが、 ログイン時の.cshrc に記述されたsetenvは有効になって いる様子で、パスが通らないと動かないDB用のコマンドが ちゃんと起動します。 どなたか、ご存知の方がいらっしゃいましたら 教えてください。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

『shell 記述したsetenvが無効になります。』 正しく設定されているはずですよ。 シェルスクリプトを下記の用に変更してご確認ください。 #!/bin/csh setenv 環境変数 環境変数パス echo "環境変数 の値は $環境変数 です。" 正しく設定されている事が確認できると思います。 『などと記述し、sh test.sh でプロンプトから 実行したときのsetenvでは無効になります。』 それは違う所を見てますよ。 環境変数はプロセスが持っています。 シェル上からコマンドを起動すると、そのコマンドはシェルの子プロセス(対話シェルとは別のプロセス)として起動されます。 シェルスクリプト内で設定した環境変数は子プロセスの環境変数領域に値を設定します。(設定する場所はシェルスクリプトから見たら親プロセス[対話シェル]の環境領域ではなく子プロセスの環境領域です) シェルスクリプトの終了で子プロセスは終了し開放されますので子プロセスで設定した値も廃棄されます。 『root ではなく、通常ユーザなので、管理者が 制限をしているのかもしれませんが、』 root であろうが一般ユーザであろうが同じ動作をします。 『ログイン時の.cshrc に記述されたsetenvは有効になって いる様子で、パスが通らないと動かないDB用のコマンドが ちゃんと起動します。』 ログイン時や csh 起動時に .cshrc を読み込む時にはシェルは子プロセスを起動せず自身の環境で実行しますので、そこでの環境操作は対話シェルに反映されます。 また、パスが通らないと動かないDB用のコマンドはちゃんと動くはずですよ。(下記のシェルスクリプトで、スクリプトを動かしている子プロセスの環境が迫っていされ動作する事が確認できるでしょう) #!/bin/csh setenv 環境変数 環境変数パス DB用のコマンド 上記では起動した子プロセスないの環境(環境変数設定が行われている)を使っているので DB用のコマンドが意図通り動くと思いますよ。 多くのシェルは子プロセスを起動しその上で動かしたり、自身が直接動かしたりという事を区別して行います。シェルのオンラインマニュアル等にも違いがしっかり記載されていますのでご確認ください。 プロセスの環境に影響を与えるコマンド(例えば cd )でも同様な事が起こりますので意識してお使いください。 % ( setenv 環境変数 環境変数パス ) ※ 上記方法(カッコで囲み)で起動するとシェルスクリプトと同様子プロセスを起動しそのプロセスで環境変数を設定、終了と共にその環境を破棄しますから直後に環境変数を確認しても設定されてない様に見えるはずです。(実際には設定した環境が破棄されてしまっているだけなのですが) cd や setenv はビルトインコマンド(内部コマンド)としてシェル内に実装されています。これは動作中のシェル自身の環境を操作する必要があるからです。外部コマンドは必ずプロセスを起動して実行されますので外部コマンドとして追加・作成したソフトの中で親プロセスの環境を操作する事は通常できません。 スクリプトを下記の方法で起動すればシェルは自身の環境でスクリプトを読み込み実行しますので内部コマンドによる環境へ影響の与えるコマンドの実行結果が起動した親プロセスに反映されます。 標準シェル系 $ . setup_script.sh Cシェル系 % source setup_script.csh 標準シェル系の . で起動する手法は /etc/rc 等の起動時システム設定等でも多用されていると思いますので読んでみると良い(学べる事が多い)でしょう。

db_mag
質問者

補足

早々のご回答ありがとうございます。 私の記述の方法がいけなかったのですが、 sh test.sh と実行した後に プロンプトからsetenvの内容が 反映されなかったということでは無く、 【setenv コマンドそのものがエラーになる】と言いたかったのです。 実際のshell記述では、10通り以上の変更を加え、下記の記述も 行っています。 ---------------------------------------------- #!/bin/csh setenv 環境変数 環境変数パス echo $環境変数 > test.log ←こんな記述 ---------------------------------------------- で、これをログインした時のコマンド上で、 # sh test.sh と実行すると、cat test.log で【環境変数パス】が表示されますが、 crontab で実行すると、setenv に対しては【そのコマンドは無い】 と表示され、test.log には、半角1byteのみが記述されていたのです。 なので、crontab で指定した.sh 内部に記述したsetenvコマンドは、 無効になるのでしょうか? という内容に訂正させて頂きます。 記述があいまいですいませんでした。

その他の回答 (2)

回答No.3

シェルスクリプト 1 行目の #! /bin/csh の様な行をインタプリタ(指定)行と呼びます。 インタプリタ行は実行権を付けたファイルを起動した時使われます。 今回の質問では下記の通り起動してますので sh test.sh そのスクリプトはsh(標準シェル)で実行されます。 setenvはcshの内部コマンド(builtin コマンド)なのでshにはありません。 ですから、 ## などと記述し、sh test.sh でプロンプトから ## 実行したときのsetenvでは無効になります。 というのは間違いで、 setenv を実行したけどエラーとなり何もされなかった というのが正しいです。 今回、 sh test.sh で実行しsetenv がエラーになったと思われますが、csh test.sh で実行してみてください。 そうすれば、setenv コマンドは意図通りに処理される(csh スクリプトとして処理されますので)と思います。 また、 sh -x test.sh としてみてください。shとして実行した時の細かな動作が理解(調査)できると思います。 今回の様に まるで質問を変える場合には一旦終了し新たな質問として作成しましょう。 そうすれば、新たな質問として多くの方の目に止まります。(新たな質問ではなく多くの方が一度見て助言できないと判断したままとなっていますので、見てくださる方が非常に少なくなっているはずですし、解決できる可能性のある方を減らすのは回答をいただきたい質問者としては損な事だと思います) また、後で同じ問題に困った人が見る時にもタイトルと中身が変わってしまっている質問は見付難いです。 せっかく公開されているQ&Aが役立ちません。 前の返事として関連している事を多く助言していると思いますのでしっかり理解してくださればありがたいです。 せっかく書いた事ですから。

db_mag
質問者

お礼

saijyo_739様。 回答、ありがとうございます。 解決致しました。 登録、質問共に初めてで、記述の方法すらよくわかりませんでした。 その辺りの事まで教えて頂いて、とても助かります。 また、質問することになると思われるので、 宜しくお願い致します。 何よりも、早い回答に感謝しております。 心より、ありがとうございました。

  • 774danger
  • ベストアンサー率53% (1010/1877)
回答No.1

> sh test.sh でプロンプトから実行したときのsetenvでは無効になります。 それは、そのスクリプトの中での設定の話ですから たとえば、cshを起動しているときにコマンドラインからcshを起動してsetenv しても、logoutして元のcshに戻ったときにはsetenvした内容は消えてますよね testというファイルに、 setenv 環境変数 環境変数パス を書いて、 source test を実行してみましょう

db_mag
質問者

お礼

早々のご回答ありがとうございます。 私の記述方法に誤りがあり、他の方への再度の質問で 解決いたしました。 ご指導、ありがとうございました。

関連するQ&A

  • bashでの変数の引渡し方法

    bashを使用するのが初めてなので教えてください。 shellscriptの中で変数を設定するのに共通変数設定用の子Shellを実行して変数を設定したいと思っていますが、うまく動きません。どのように設定したらいいのでしょうか。cshのときはsetenvでよかったのですが。。 親shell(hoge.sh) -------------- #!/bin/sh ./setenv.sh #変数設定用子Shell echo $USER exit 0 -------------- 子Shell(setenv.sh) -------------- #!/bin/sh USER="hoge" exit 0 -------------- 実行すると以下のようになります。 $./hoge.sh USER: not found

  • httpd で SetEnv が使えない

    httpd-2.2.17を使っております。 --enable-suexec でconfigure しておりますが、cgi の中でいくつかのモジュールを使う関係で LD_LIBRARY_PATH を設定する必要があります。 そのため、httpd.conf に SetEnv LD_LIBRARY_PATH xxxxxxxxxxxx を記述しております。 ところが、cgi でモジュールを使おうとすると、読み込みに失敗してしまいます。調べてみると SetEnv で設定したはずの LD_LIBRARY_PATH が設定されていません。 さらに、いろいろ調べて suexec を使っているために SetEnv が無効になっていると分かりました。 しかし、suexec はセキュリティ的には便利なのでできれば、使いたいのです。 suexec を有効にしつつ、cgi に環境変数を渡す方法はないでしょうか?

  • 環境変数の設定

    OS:MacOS10.4.7 ant version:1.6.5 antの設定で困っています。macでの環境変数の設定(パスを通す)はどうすれば良いのか困っています。 現段階ではantをusr/localで展開し、シンボリックリンクを作成。 次段階の環境変数の設定で~/etc/csh.cshrcに setenv ANT_HOME /usr/local/ant set path=( $path $ANT_HOME/bin ) を加えたのですがantが動作しません。 どなたか解決方法・間違え点ありましたら教えてください。 宜しくお願いします!!

  • 『存在するかどうか分からない』環境変数にcshで新しいパスを設定したい

    Linuxを利用しており、「『存在するかどうか分からない』環境変数に新しいパスを設定したい」のですが、うまくいきません。 言い方を変えると、対象の環境変数が存在しようが存在しまいが、うまくいくようにしたいのです。 具体的には、ログインシェルに tcsh を使用しているため、hogehoge.cshを作成し、/etc/csh/login.d/に入れました。hogehoge.cshの内容は以下のようになります。 #!/bin/csh setenv HOGEHOGEPATH /usr/lib/hogehoge:${HOGEHOGEPATH} ログインしてみると HOGEHOGEPATH: Undefined variable. といった内容のエラーが表示され、環境変数も設定されません。 shで設定する方法もありますがcshで良い書き方はないでしょうか。ご教示お願いいたします。

  • csh(Cシェル)のevalに関して

    evalを用いてインクルード的な事を行いたいのですが、「コマンドが見つかりません」が出てきて困っています 原因はなにがあるのでしょうか? 色々ネットで調べて同じように記述したつもりなのですが csh初心者で申し訳ありませんが 使い方が悪いのか、環境が悪いのか?判断できません 環境は別の人に作って貰ったんで、環境なら環境から勉強していきたいと考えてます ■TEST010.csh #!/bin/csh echo "TEST010-Step0010" eval `./TEST000.csh` echo "TEST010-Step0020" echo " set root_path $root_path;" echo "TEST010-Step0090" ■TEST000.csh #!/bin/csh set lcmoji01 = /export/home/tbn/km echo "set lcmoji01 $lcmoji01;" ■実行結果 > csh TEST010.csh TEST010-Step0010 ^M: コマンドが見つかりません。 TEST010-Step0020 lcmoji01: 未定義の変数

  • .cshrc ファイルについて

    新しくUNIXのパソコンを引き継いだのですが、分からない事だらけで困っています。 どうか、教えて下さい。 聞きたいことは 1. ホームディレクトリ下に.cshrcファイルがないけど、作ったほうが良いのか? 2. 作成する場合はどの様にすればよいのか? 3. rootユーザにも『passは通し』た方が良いのか? 等です。 状況などを 説明をさせて頂きます。 『intelフォートラン コンパイラ』をインストールする必要があり、インストールまでは出来た(と思う)のですが、 手引きのページに、以下の記述がありました。 > この後、.cshrc等にpathの設定をする。設定の書き方の例はデフォルトの/opt/intel/fc/9.0にインストールした場合、 > /opt/intel/fc/9.0/bin/ifortvars.csh や > /opt/intel/fc/9.0/bin/ifortvars.sh > に記載されているので、参照すること。 > .cshrcの場合、このifortvars.cshに記載されているのをそのまま.cshrcに加えれば良い。 > 同様に、 > /opt/intel/idb/9.0/bin/idbvars.csh > /opt/intel/idb/9.0/bin/idbvars.sh > の内容を加えることで、デバッガーのpathも通しておく。 .cshrcファイルがどの様な物なのかも分からなく、調べるうちにそのユーザの設定ファイルである事は分かりました。 それで調べたところ、ログインしているユーザーのホームディレクトリには.cshrcファイルがありません。 su に切り替えてfind コマンドで検索したところ、rootフォルダの下に同名のものが1つありました。 また別のページに > 『今回紹介する技は、csh (C シェル、ECC の UNIX 環境でのデフォルトのシェル) の設定ファイルの編集です。 > これを編集するだけで、シェルの挙動を変更して日頃の生活を快適にすることができます。 > ただし、下手をするとログインできなくなるので、注意深く実行してください。 』 > 『.cshrc はホームディレクトリにおいておくものです。もしなければ、作ってください。..』 なんて記述もあり、これから毎日使っていくものなので、作くるべきかな?と思っているのですが、 どのようにしたらいいのか分かりません。 rootフォルダ下の.cshrcファイルをコピーしてきたら良いのでしょうか? 環境は、2台のPCをLANで繋いでおり、それぞれ CentOS が入っています。 普段はマスターでログインし、スレーブはあまり使ってません。 マスターは部屋のサーバーとなっているようです。 ログイン出来なくなるのがとても怖いのです。 自分だけのユーザーを作ったほうが良いのでしょうか? 色々調べてはいたのですが、確信を持てないので質問させて頂きました。(Linux は種類が多いので..) どうか教えて下さい。よろしくお願いいたします。

  • Perl から csh 実行

    やまとです。 いつもありがとうございます。 Perl + csh を同時(?)に実行する方法を教えてください。 OSはSunです。 具体的にどのような処理を行いたいか簡単に説明しますと。 1.Perlでcshを実行(system関数?)し、cshで環境変数をセット(source)する。 2.cshで環境変数をセットしたら、ファイルを出力する処理が行われます。 3.Perlでcshによって出力されたファイルの内容を画面に表示します。 以下ソースを掲載します。(抜粋して) ================================================== = Perl ( test_perl.pl ) $data = "ABC"; $ret = system(`test_csh.sh $data`); ・ ・ ファイル(test.log)を開き、読込、画面に表示します(まだ作成してません。) ================================================== = Csh ( test_csh.sh ) source test_source.sh echo $1 > test.log ================================================== = test_source.sh setenv CLASSPATH .:/aaa・・・・・・ ↑ PATHの設定を行ってます。 ================================================== 画面に、「ABC」と出力させたいのです。 Perlからcshが実行されていないように思えるのですが、 Perlのsystem関数の使い方が誤っているのでしょうか? それとも、ClassPath等の設定をしなければならないのでしょうか? ちなみにコマンドから、 # test_csh.sh ABC と実行しますと、ファイルが出力され、かつ、sourceも実行されています。 Perlから実行する方法を教えてください。 説明が不十分であれば、補足いたしますのでご指摘ください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • cshellスクリプトの環境変数で "Bad : modifier in $" のエラー

    C-Shellで環境変数を設定する場合の質問です。$HOGEに$HOGEAを追加しようとした場合、以下のように$HOGEを括弧で括る必要があるようで、そうしないと以下のようなエラーで怒られてしまいます。 これはどうしてなのでしょうか。 -------------------------- #! /bin/csh -f setenv HOGE aaa:bbb setenv HOGEA ccc setenv HOGE $HOGE:$HOGEA # OK setenv HOGE ${HOGE}:$HOGEA # NG -------------------------- <エラー> -------------------------- Bad : modifier in $ ($). --------------------------

  • Cシェルについて

    Cシェルについて #! /bin/csh ##! /bin/csh -vx setenv NOHUP '/usr/bin/nohup' set AAA_CSH = $NOHUP' XXX.sh file.txt &' ($AAA_CSH >> /dev/null) >>& err.log シェルスクリプトを作成して上記のとおりnohupでXXX.shを実行するように記述します。 エラーがあった場合、err.logに出力するように作成したつもりなのですが、 XXX.shがなかったとき、 「/usr/bin/nohup: XXX.sh:そのようなファイルまたはディレクトリはありません。」 と標準出力されてしまいます。 このエラーメッセージをerr.logに記述するようにしたいのですが、 どうしたらよいでしょうか? よろしくお願いいたします。

  • はじめてSolarisを使って

    いるのですが LANG=ja LOGNAME=root MAIL=/var/mail/root MAILCHECK=600 OPTIND=1 PATH=/usr/sbin:/usr/bin PS1=# PS2=> SHELL=/sbin/sh TERM=vt100 TZ=Japan # set |grep shell # set | grep -i shell SHELL=/sbin/sh となりましたがこれはB-Shellと解釈していいでしょうか?