• ベストアンサー

シェルの中からシェルを呼び出して判定

UNIXで以下のようなシェルが動作しております。 #!/bin/sh su abcdef -c './GHI'; err=$? if [! $err -eq 0 ] then echo エラーが発生しました fi exit このシェルは「abcdef」ユーザに移ってカレントディレクトリのシェルコマンド「GHI」の結果を判定するというものです。 UNIX上では問題なく動作しております。 これをLinuxでそのまま動作させると「err」に「su abcdef」というユーザ切替コマンド自身の正否を格納しているようです。 「'」でくくられた範囲内で結果をファイルに格納したりして、その後ファイルの中を見て判断するとうまくいくことは分かっておりますが、出来たらファイルなど使いたくありません。 このような場合、みなさんどうしてるんでしょうか? よく出てくるパタンだと思うのですがどうしても良い対処が見つかりません。 どうか宜しくお願いします。 Linuxは「miracle-Linux2.0」というOSです、いわゆるRedHat系です。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.3

このスクリプトが何かの1部でなくこれで全体なら、 su abcdef -c './GHI || echo エラーが発生しました' でいいんですけどね。 そうじゃない場合、GHIが何も標準出力に出力しないとすると、 err=`su abcdef -c './GHI; echo $?'` もし、GHIが何か出力しても、単にターミナルに出していいなら err=`su abcdef -c './GHI >/dev/tty; echo $?'` でOKです。 このシェルスクリプト出力全体のリダイレクトを考慮して/dev/ttyじゃなくてGHIの出力をどうしても標準出力に出したいなら、 exec 3>&1 err=`su abcdef -c './GHI >&3; echo $?'` exec 3>&- で多分できると思います(多分…)。

DIRI
質問者

お礼

回答ありがとうございました。 err=`su abcdef -c './GHI; echo $?'` で対処できそうです 「なるほど!」と思いました勉強になりました ありがとうございました。

その他の回答 (3)

回答No.4

うちのボスに聞いたところ、そういうバグバグなシステムを使ったことがある...とのことで、そのときはシェルのバグだったそうです。それで su abcdef -c 'exec ./GHI' というようにexecを付けたら行けたそうです。try&errorしても時間の無駄だからソースを読みなさいといわれてしまいました(^^; Miracle-LinuxってLinux版ORACLEのためにチューニングされたdistroでしたっけ?ソースはFTPサイトには見つからないようですが...。

DIRI
質問者

お礼

#3の方の方法で進めようと思います。 しかし、たいへん参考にさせて頂きました。ありがとうございました。

DIRI
質問者

補足

回答ありがとうございました miracle-Linux2.0とはお察しの通りOracleの為にチューニングされたLinuxという位置づけです。 参考にさせて頂きました。

回答No.2

Debian (2.2, 3.0)では$?に-cで実行した戻り値が入ってきました。echo $errをsuの次の行に入れてみればsu -cが期待通りに動いているかわかりますね。 ところで、 if [! $err -eq 0 ] これは[と!の間にスペースが必要ですね。単に if [ $err -ne 0 ] と書くほうが間違いが少ないかも。

DIRI
質問者

お礼

今回は、#3のかたの方法で進めようと思います。 しかし、記述ミスの指摘などたいへん貴重なご意見をいただきましてありがとうございました。

DIRI
質問者

補足

回答ありがとうございます。 [と!の間はスペースですね、記述ミスしていました実際は入っていると考えてください。 #1の補足にも書きましたが.. 「./GHI」は必ずエラー(1)を返すようにして su - abcdef -c './GHI;echo $?'; echo $? とすると 1 0 という結果になります。 クォートの中でステータスを判定せよ!ということなのですしょうね。 もう少し調べてみます。

  • usotsuki
  • ベストアンサー率46% (147/319)
回答No.1

Distributionにより異なるのかも知れませんので参考程度です。 su abcdef -c './GHI'; err=$? su - abcdef -c ./GHI; err=$? "-"がないと、一般ユーザの"abcdef"ではなく、元(恐らく、rootユーザ)の環境を引きずるので、ユーザホームには、変わらないのではないでしょうか? "-c"オプション(コマンドオプション)で、GHIがシェルが、ユーザホームに存在するとして、クォートなしで、直接コマンドを記述するのではないでしょうか?

DIRI
質問者

お礼

一応、今回は#3のかたの方法がマッチしたようです。 しかし、たいへん参考にさせていただきましたありがとうございました。

DIRI
質問者

補足

回答ありがとうございます。 su abcdef -c './GHI'; err=$? でも su - abcdef -c ./GHI; err=$? でも結果はやはり 「./GHI」の結果がerrに入るようにはなりませんでした。 「./GHI」は必ずエラー(1)を返すようにして su - abcdef -c './GHI;echo $?'; echo $? とすると 1 0 という結果になります。 クォートの中でステータスを判定せよ!ということなのです。 一旦、ファイルに書き出さないで済む方法だけでも分かれば有難いんですが。 もう少し調査してみます。

関連するQ&A