• ベストアンサー

Bourne Shellでネストした上位シェルに$?を返す方法

Bourne Shellでは$?で直前のコマンドのステータスを確認できるようですが、これとは逆にネストした上位シェルに$?を返す事はできますか? aaaa.sh から bbbb.sh を呼び出しているとして、その呼び出した直後に$?でステータスを確認する場合、 bbbb.sh 側ではどのように戻り値をセットすれば良いですか?

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

  • ベストアンサー
  • hito-koto
  • ベストアンサー率53% (14/26)
回答No.7

話が込み入っているようですが・・・ 単純に子プロセス(下位シェル)で、 exit 4 とすれば、親プロセス(上位シェル)で参照できます。

webuser
質問者

お礼

有難う御座いました。

その他の回答 (6)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.6

>既存のコードに書かれているコマンドの意味を調べるには十分でも、やりたい事が可能かどうか? >可能ならどういうコマンドをどのように利用するのか? >という目的先行の場合には十分でないからです。 まず、man sh を読んで全部頭に入れてください。もし入りきればそれで「やりたい事が可能かどうか?可能ならどういうコマンドをどのように利用するのか?」はわかるはず。 >この場合 >bbbb.shで >exit $? >としておき、 >aaaa.sh側で >if $? >then >処理 >fi > >とするのでしょうか? そもそも、「Bourne Shellでは$?で直前のコマンドのステータスを確認できる」を理解されてないようですが。 まず、子スクリプトのほうは上にお書きのとおりでOKです。 親スクリプトのほうは、直前のものがコマンドであろうが、子シェルスクリプトであろうが同じです。 if test $? = 0 then 成功のときの処理 else 失敗のときの処理 fi test コマンドには [ という別名もあるので、 if [ $? = ] でもかまいません。

webuser
質問者

お礼

>まず、man sh を読んで全部頭に入れてください。 >もし入りきればそれで「やりたい事が可能かどうか?可能ならどういうコマンドをどのように利用するのか?」はわかるはず。 たしかに、その通りかもしれませんが、 では法律について質問している人がいたら 「六法全書を全て頭に入れて下さい。そして過去の事例を合わせて考えれば分かるはずです」 と答えるのでしょうか?   >if test $? = 0 >then 成功のときの処理 >else 失敗のときの処理 >fi > >test コマンドには [ という別名もあるので、 >if [ $? = ] >でもかまいません。 有難う御座います。参考になりました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

違ったキーワードで検索すれば異なる結果が得られる可能性があるわけで、 そういった意図でお聞きしたのですが明らかにしたくないということであれば 無理強いはしません。 ということでわたしもわたしの自由を行使させていただきます。

webuser
質問者

お礼

結局のところ、 あたなのレスは「説教はしたいが答えは教えたくない」という事ですね。 それではタダのアラシです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

参考までにどんなキーワードで検索したか補足してもらえませんか? それから、 > 既存のコードに書かれているコマンドの意味を調べるには十分でも、やりたい事が可能かどうか? > 可能ならどういうコマンドをどのように利用するのか? > という目的先行の場合には十分でないからです。 ということなら、むしろネット上を探すよりは Amazon.co.jp: UNIXシェルスクリプト逆引き大全333の極意―Linux,FreeBSD,Solaris,Mac OS X対応: 本: 中橋 一朗 http://amazon.jp/dp/4798008842 こういう本を用意しておいたほうがいいんじゃないでしょうか。 これのほかにも同様の趣旨の本があったような気もしますが それも含めて自分の目で確かめてみてください。 ネット上にはピンポイントな情報ならあふれているでしょうけれども 体系的にまとめているようなところはあまりないと思います。

webuser
質問者

補足

>参考までにどんなキーワードで検索したか補足してもらえませんか? ここは質問と回答やりとりをするところです。 掲示板の主旨からから脱線するので控えさせていただきます。 この場合 bbbb.shで exit $? としておき、 aaaa.sh側で if $? then 処理 fi とするのでしょうか? bbbb.shで 環境変数にexportしておいて aaaa.sh側でその内容を確認する形でもいけそうですが、 それはあまり一般的な方法ではないでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

まずは #2 で言われている通り man sh が基本でしょう. 普通の用途にはこれで十分. ネットでも適当にキーワードを入れれば探せると思うんだけどなぁ. とりあえず最初に見付かったのが http://hemsidor.torget.se/users/d/Devlin/shell/man_sh.html

webuser
質問者

補足

ネットで適当にキーワードを入れれば、Bourne Shell以外のシェルのサンプルコードが大量にヒットして目的にあったサイトがなかなか見つからなかったりするのです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> Bourne Shellのマニュアルってどこかネット上にありますか? なぜネット上? man sh じゃ不足なんでしょうか。 まあネット上にもマニュアル、解説含め転がってはいますが。

webuser
質問者

補足

>なぜネット上? >man sh じゃ不足なんでしょうか。 既存のコードに書かれているコマンドの意味を調べるには十分でも、やりたい事が可能かどうか? 可能ならどういうコマンドをどのように利用するのか? という目的先行の場合には十分でないからです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

マニュアルを読めばわかると思うんだけど exit.

webuser
質問者

補足

Bourne Shellのマニュアルってどこかネット上にありますか?

関連するQ&A

  • シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2

    シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2...のような位置パラメタや、$?,$$,$!,$-のような特殊変数がありますが、これはPerlやRubyもあるようですが、意味や効果、やり方等は同じでしょうか。 当方はPHP,JavaScriptしか触れていませんし、PHPやJavaScriptは、そのような位置パラメタや特殊変数は見当たりませんでした…。 つまり、PerlやRubyはUNIXのコマンドから誕生したスクリプト言語ということでしょうか。 こういった位置パラメタや特殊変数はPerlやRuby以外に他の言語にもありますでしょうか。PythonとかCとかJavaとか…。 また、Bシェルを学んでいる途中ですが、シェルスクリプトの中にはbourne以外にもbashやC Shell,zsh,Perlがありますが、何故Perlが入っているのでしょうか。 Perlをやっている方は別途シェルスクリプトをやる必要はないということでしょうか。

  • PHPからシェルが動作しない

     PHPを通して外部コマンドを実行したいのですが、うまく動作してくれません。  具体的には、あるページでボタンを押したら、IPMessengerでメッセージを飛ばす機能(コマンド名:tipmsg)を実装したいのです。  シェルスクリプトは「コンソール」上では、きちんと動作してくれます。  例(shell.sh)  echo HELLO | tipmsg -e -u anyuser  また、コンソール上で「php」を直接動かしても、きちんと動作してくれます。(「php doshell.php」)  例(doshell.php) <? echo "Hello"; #動作するかどうかを確認するための表示させる system("shell.sh"); ?>  両方とも、コンソール上では、きちんと動作してくれるのですが、ブラウザ上からだと動作してくれません。  ちなみに、PHPからシェルを呼び出す以下のコマンドもすべて試しました。  exec("./shell.sh")  system("./shell.sh")  shell_exec("./shell.sh")  他にも環境変数をいじったり、アドミッションを調整したりもしましたが、まったく目的どおりの動作をしてくれません。  もしも、わかる方がいたらご教授のほど、お願いします。

    • 締切済み
    • PHP
  • シェル内でクロンから起動されたかを判断できる?

    シェル初心者でっす とあるシェル(仮にshell.shとする)があったとき、 shell.shのプログラム内で自身がクロンから実行されたのか それとも手動実行(sh shell.shとコマンドライン入力された)のか 判断させる方法ってありますでしょうか 基本はクロンで実行させますが、 手動で実行させた時に別の動きをさせたいのです (ダメならファイルを分けるつもりですが…) よろしくお願いいたします

  • PHP シェルスクリプト 引数

    失礼します。現在PHPからシェルスクリプトを引数を付けて実行し、戻り値で確認が出来るか試しているのですがなかなか参考になる記事がなく実現が出来ない状態です 調べたところ、 phpからhoge.shというシェルファイルをargという引数で実行したいとします。 引数を"'. .'"で囲う事で、引数を渡せるようです。 $output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"') var_dump($output) 上記のような記事を見つけたのですがhoge.shはどのように$argを受け取り、戻り値を渡しているのでしょうか?また、$argの値の中身は渡す引数の内容という認識で正しいのでしょうか?サンプルコードなどがあるとうれしいです。 ご教授よろしくお願い致します。

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

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

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

  • uniqとループを使用しないで、文字列のフィルターの方法

    表題の件にて、質問です。 bashでshを作成しています。いろいろ試しているのですが、 UNIXのコマンドで、uniqコマンドがありますが、それと同じことをsed又は、awk等を使用して、作成することは可能でしょうか? 作成が可能であれば、記述方法を教えてくださいませ。 ※ループ文を使用しないで、出来るだけ完結なコマンド文にしたい。 例: file.txt 以下中身 ---------------------- AAAA BBBB BBBB CCCC CCCC ----------------------- ↓ AAAA BBBB CCCC の3文字のみを出力したい。 ご存知の方いらっしゃいましたら、ご教示ください。

  • Eclipseのプロジェクトをシェルで実行する方法

    Eclipseで生成したプロジェクトを以下のコマンドでシェル実行したところ、以下のエラーが出ました。 /c/Apprication/pleiades-2020-06-java-win-64bit-jre_20200702/pleiades/workspace/home/ShellTest/shell_and_Java $ ./.do-java.sh 「エラー:メイン・クラスshell_and_Java.HelloWorldが見つからなかったかロードできませんでした。」 Eclipse上のフォルダ階層は以下となっています。 ■Eclipse上のプロジェクト ShellTest (プロジェクト名) →src  (フォルダ) →→shell_and_Java (パッケージ) →→→HelloWorld.java →bin →→shell_and_Java →→→HelloWorld.class (クラスファイル) →shell_and_Java (フォルダ) →→.do-java.sh (シェルスクリプト) ■do-java.shの内容 java shell_and_Java.HelloWorld ■HelloWorld.javaの内容 printlnで"HelloWorld"を表示する単純な処理です。 環境変数やクラスパスの設定など、それぞれ正しく設定できているのか、どの状態が正しいのか分からず困っています。。 よろしくお願いします。

    • ベストアンサー
    • Java
  • シェルの実行中にユーザ切り替えてコマンド実行

    はじめまして。 シェル初心者です。 shell.shをrootユーザでクーロン実行していますが、 shell.shの処理の中で、違うユーザでコマンド実行したいのですが、 可能かどうかも、方法が分かりません。 教えていただけないでしょうか。 環境はLinuxです。 下記のコマンドを実行したいです。 リモートでログインしてコマンド実行結果を取得する ssh -l tomcat server_tomcat grep test /tmp/test.log ※他のユーザでsshを実行してコマンド結果を取得したいです。 以上。宜しくお願い致します。

  • UNIXシェルのデバッグ

    サーバーを更改したので業務システムを丸ごと 新しいサーバーへコピーしてきました。メニューのシェルが数十個 あるのですが、恐らくそのまま動くとは思うのですが、一応 シェルからシェルへの移動(遷移っていうんでしょうか)くらいは 確認しようと思っています。 そのままシェルを順番に動かす以外の手法は何かありませんでしょうか? sh -xで動かせば詳細な情報をログとして残せますが、シェル内のコマンドも 実行してしまうので時間がかかります。シェル内のコマンドを実行させないで すむ手法があればご教授ください。

専門家に質問してみよう