シェルスクリプトの実行方法について

このQ&Aのポイント
  • シェルスクリプト内でi18nの再読み込みをするためには、. /etc/sysconfig/i18nと記述しますが、シェルスクリプト終了後にi18nの内容が反映されません。
  • 「./shell1.sh」を実行したスクリプトは新たに作成された子プロセスによって実行され、スクリプトが終了し親プロセスに戻っても親自身は再読み込みを行なっていないため、このような現象が起こります。
  • 「source shell1.sh」とsourceコマンドを使ってシェルスクリプトを実行すると、i18nの再読み込みが正しく行われます。しかし、エラー時にログアウトするなどの弊害があるため、他の回避策も検討する必要があります。
回答を見る
  • ベストアンサー

適切なシェルスクリプトの実行方法について

シェルスクリプト内でi18nの再読み込みをするために . /etc/sysconfig/i18n と記述するとシェルスクリプト終了後にi18nの内容が反映されていません。 シェルスクリプト自体は ./shell1.sh という形で実行しています。 質問1:このようになるのは「./shell1.sh」と実行したスクリプトは 新たに作成された子プロセスによって実行される為、スクリプトが終了し 親プロセスに戻っても親自身は再読み込みを行なっていないから、という認識で間違いないでしょうか。 質問2:この現象の回避策として「source shell1.sh」とsourceコマンドで シェルスクリプトを実行する方法を試してみました。 実際に上手くいったのですが、「set -e」を使っているとエラー時に ログアウトしてしまうなどの弊害もありました。 他に適切な回避策に問題はないでしょうか。 ご存知のかた、お手数ですがご解答のほど宜しくお願い致します。

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

  • ベストアンサー
  • ballville
  • ベストアンサー率47% (233/487)
回答No.2

ごめんなさい、質問2を見落としていました。 source で同一プロセスの中で動かさなければ無意味ですので、set -e で処理を中断してしまうと その途端に落ちてしまいます。別のエラーハンドリング方法を考えてください。 たとえばこんな方法 http://d.hatena.ne.jp/yohei-a/20091222/1261458975 ならコード量も少ないでしょうし。 ダメなら素直にtrapを使うとか。 killall $0 で 止める手もあるかもしれません

参考URL:
http://ja.softuses.com/10199
ygn001
質問者

お礼

教えて頂いた方法にて解決できました! ありがとうございました。

その他の回答 (1)

  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

>シェルスクリプト自体は >./shell1.sh >という形で実行しています。 ではなく、 source ./shell1.sh とするとどうなりますか

関連するQ&A

  • シェルスクリプトの実行、「source」と「.」の違いについて

    bashのシェルスクリプトを書いています。 当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。 そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。 .bashrc の中に、 function seq() { i=$1 while [ $i -le $2 ] ; do echo $i let i=$i+1 done } と、関数を定義しました。 seq 関数をターミナル上で実行すると、 >seq 0 2 0 1 2 と正しく、表示されます。次に、 #!/bin/sh seq 0 2 と記述したシェルスクリプト(temp.sh)を「source」で実行すると、 >source temp.sh 0 1 2 と正しく、表示されますが、「.」で実行すると、 >./temp.sh ./temp.sh: line 2: seq: command not found と言われます。 どのような理由によってこの違いが出るのでしょうか??

  • シェルスクリプトで困っています 2

    度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。

  • シェルスクリプトで実行したコマンドをタイムアウトさせる方法

    シェルスクリプト超初心者です。 ログファイルを『tail -f』で開き、その内容を一時的な テキストファイルにリダイレクトで書き出します。 その処理を、一定時間経過後に自動的に終了する。 といった内容のシェルスクリプトを作成したいと思っています。 しかし、「tail -f」を実行したプロセスを一定時間経過後に どういう風に終了させればよいのかよく分かりません。 実行したプロセスを一定時間経過後に終了させるような 方法が何かありませんか? ちなみに実行環境は、Solaris9です。 【コマンド例】 tail -f ./"ログファイル" > ./temp.txt かなり、初歩的な質問で申し訳ありませんが 宜しくお願いします。

  • シェルスクリプトをバックグラウンドで

    いつもお世話になってます 初歩的な質問かもしれませんが、自力で解決できなかったのでお力をお貸しください 2点質問があります、シェルはbashです 1 シェルスクリプトを記述したファイルをダブルクリックで使っています このファイルをダブルクリックした時にターミナルを表示させないでシェルスクリプトだけ実行する事はできないでしょうか? 2 シェルスクリプト終了後、ターミナルが閉じません、スクリプト終了と同時にターミナルを閉じる方法を教えてください [プロセスが完了しました]というメッセージが出てターミナルそのものが閉じません よろしくお願いいたします

  • sudoでのシェルスクリプト実行

    ユーザに、sudoで実行してもらいたいシェルスクリプトがあります。 sudoで実行しなかった場合、「sudoで実行してください」 というような警告文を表示し、処理を実行せずに終了し、 sudoで実行した場合のみ、処理を行ないたいです。 こうした動作を実現するには、シェルスクリプトに どういった記述を追記すればいいでしょうか? 環境はMacOSXです。よろしくお願いします。

  • シェルスクリプトの[-z "${変数名:-}"]の意味について

    Linuxでシェルスクリプトをみていると以下のように if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] -z "${変数名:-}"という記載をみかけます。 シェルスクリプトの該当箇所を読んだのですがわかりませんでした。 -zは分かるのですが。 よければ教えてください。

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • Linuxでシェルスクリプトがフルパスだと実行できない

    Linuxでシェルスクリプトがフルパスだと実行できない こんにちは 現在linuxでシェルスクリプトを記載していて、やっと出来た!と思ったら、なぜかフルパスで実行すると失敗します。 中身は例えば #!bin/sh echo "hello" とし、ファイル名をtest.shとします。 実行時にカレントからだと上手くいきます。 ./test.sh ただし、フルパスで実行するとうまくいきません。 ./home/user/test.sh エラーは以下 bash: ./home/dv3/tet.sh:No such file or directory 所有者はrootでグループもrootにしてあります。 シェルの権限は755にして、rootで実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • [シェルスクリプト内で bashコマンド後のコマンドが実行されない]

    [シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

  • シェルスクリプトで複数実行するには?

    web上からもアクセスできるphpに、定期的にアクセスするようにしたいと思っています。 定期的にアクセスするには、cronを利用すればできると思っていますが、phpへアクセスする方法が分からないために、別の記事にて質問させて頂いています。 (cronが利用できる、レンタルサーバを利用しております。) そこで、いろいろと調べていたところ、.shの拡張子のファイルを作成して、その中に命令事項を記入しておき、cronで.sh(シェルスクリプト?)を実行すれば良いみたいな事が記載されていました。 定期的自動にアクセスしたいphpファイルは複数あるので、phpファイルごとにcronを設定するより、このシェルスクリプトを利用して、複数のphpにアクセスできるようにできれば良いと思いました。 例えば「abc.sh」と言うファイルに、下記を記載してアップロード、パーミッションの設定。 #!/bin/sh/usr/bin/wget -q --spider http://xxx.yyy.com/abc/xxx.php そして、cronで実行日時を設定してこのファイルを実行すれば、「http://xxx.yyy.com/abc/xxx.php」へアクセスするような事が書かれていました。 複数のアドレスにアクセスさせたい場合は、.shのファイルにはどのように記述をすれば良いのでしょうか? またcron終了後にログメールが送信されてきますが、このログメールを送信しないようにするには、どのような記述をすれば良いのでしょうか? 一応調べてみたのですが、確認をお願いします。 abc.sh >/dev/null または abc.sh 2>&1 > /dev/null または abc.sh > /dev/null 2>&1 上記のような、複数の記述方法がありました。 どの記述方法がベターでしょうか。 質問をまとめますと、 複数のphpにアクセスする、シェルスクリプトの記述方法について。 cron終了後のログメールを送信しないようにするための、cronのコマンドの記述方法。 アドバイスを頂けると助かります。