- ベストアンサー
shellスクリプトから別のshellスクリプトを呼び出す方法
今現在VineLinux4.1をサーバとして起動させております。 その関係もありまして維持としてシェルを動かす事はある意味必須の状態です。 本題はAと言うスクリプトからBと言うスクリプトを呼び出す方法がわかりません。 試してみた方法はsourceで呼び出す方法です。 A.shの中身を以下とすると #!bin/bash echo ="B.shを呼び出します" source B.sh echo ="シェルスクリプトを終了します" exit 0 上記のようにした場合、最初のecho文は出力され、B.shの内容を一通り終えると最後のechoは出力されずA.shは完了しません。 ごくごく基本的なことかもしれませんが、うまく検索にも引っ掛けられなかったので、ご質問させていただきます。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 >cshは=の前後にスペースが入るかと思いますが、今回はbashを指定しておりますので。 cshの何のことを言ってるのかわかりませんが、例えばbashで、 echo="シェルスクリプトを終了します" は、echoコマンドじゃなくて、echo というシェル変数に「シェルスクリプトを終了します」という文字列をセットするコマンドになります。当然何も表示されません。 >A.shとB.shは単独で正常に稼動できる状態です。 B.shが単独で正常に動いているように思えることは、B.shに問題がないことを意味しません。 例えば、B.sh をexitで終了したりするとそこでbashは終了するわけだし。 >質問の例はあくまで例ですが、 書かれているA.shに問題がなさそうなので、B.shの中に原因があると想像しました。 現象が発生する最小限の、A.sh と B.sh の内容をすべて正確に書いてください。 今気づきましたが、A.sh の最後に無意味なexit 0がありますが、もしかして、B.shの最後にもexit 0が? source コマンドは、その場所に指定したファイルの内容を挿入するコマンドです( C の #include 相当 )。もし、新たにbashプロセスを起動して、そこでB.shを動かしたいなら、 bash B.sh です。他には#1の方が書いた方法もあります。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
B.sh の中に原因があるのではないですかね。 あるいは、echo と = の間に空白が無くて、echoコマンドになってないとか。
補足
ご回答ありがとうございました。 質問の例はあくまで例ですが、同様の指定方法でログなどは吐き出されておりますのでechoコマンドの使い方は間違っていないと認識しております。 cshは=の前後にスペースが入るかと思いますが、今回はbashを指定しておりますので。 その他は#1の補足とあわせて何かアドバイスがございましたら宜しくお願い致します。
- sakusaker7
- ベストアンサー率62% (800/1280)
ちゃんと実行ビットを立てていれば >source B.sh は、 B.sh か、もしA.shと同じディレクトリにあって、そのディレクトリがPATHに登録されていないものであれば ./B.sh でいけませんか?
補足
早速のご回答ありがとうございました。 補足と致しましてB.shの内容は正常に実行されております。 問題はA.shの内容の途中でB.shが組み込まれているわけですが、この呼び出されたB.shが終了してしまうと残りのA.shの内容を残して終了してしまう事なんです。 スクリプトの内容はA.shがサービスの起動内容になり、B.shはiptablesの設定になります。 やりたい事は起動したサービスに対し、iptablesの設定を同時に、適切に行うというもので、A.shの内容の中にB.shを組み込まなければ、A.shとB.shは単独で正常に稼動できる状態です。 これで何かわかればお願い致します。
お礼
notnot様、ご回答ありがとうございます。 私の勘違いで「=」を挿入してしまいました。 おっしゃるとおりです、お詫び申し上げます。 実際試してみたところ「bash B.sh」、これが私のほしかった回答です。 A.shとB.shは単純に合わせると500行に及ぶ内容でしたので今回かなり簡略化して例題とさせていただきました。 無意味なexit 0とおっしゃられますが、シェルの結果情報として戻り値を設定しておくのは基本と認識していたのですが、誤解のようですね。 このあたりも改めて勉強させていただきます。 今回は「bash B.sh」で質問の回答が得られたと言う事で締めさせていただきます。 この度は私の勘違いもあいまって回りくどくなってしまいましたが解決できまして助かりました。 ありがとうございました。