dポイントプレゼントキャンペーン実施中!

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系です。

A 回答 (4件)

このスクリプトが何かの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>&-
で多分できると思います(多分…)。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/14 09:27

うちのボスに聞いたところ、そういうバグバグなシステムを使ったことがある...とのことで、そのときはシェルのバグだったそうです。

それで

su abcdef -c 'exec ./GHI'

というようにexecを付けたら行けたそうです。try&errorしても時間の無駄だからソースを読みなさいといわれてしまいました(^^; Miracle-LinuxってLinux版ORACLEのためにチューニングされたdistroでしたっけ?ソースはFTPサイトには見つからないようですが...。

この回答への補足

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

補足日時:2004/06/14 09:32
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/14 09:44

Debian (2.2, 3.0)では$?に-cで実行した戻り値が入ってきました。

echo $errをsuの次の行に入れてみればsu -cが期待通りに動いているかわかりますね。

ところで、

if [! $err -eq 0 ]

これは[と!の間にスペースが必要ですね。単に

if [ $err -ne 0 ]

と書くほうが間違いが少ないかも。

この回答への補足

回答ありがとうございます。
[と!の間はスペースですね、記述ミスしていました実際は入っていると考えてください。
#1の補足にも書きましたが..
「./GHI」は必ずエラー(1)を返すようにして
su - abcdef -c './GHI;echo $?'; echo $? とすると

1
0

という結果になります。
クォートの中でステータスを判定せよ!ということなのですしょうね。
もう少し調べてみます。

補足日時:2004/06/11 10:25
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/14 09:43

Distributionにより異なるのかも知れませんので参考程度です。



su abcdef -c './GHI'; err=$?

su - abcdef -c ./GHI; err=$?

"-"がないと、一般ユーザの"abcdef"ではなく、元(恐らく、rootユーザ)の環境を引きずるので、ユーザホームには、変わらないのではないでしょうか?

"-c"オプション(コマンドオプション)で、GHIがシェルが、ユーザホームに存在するとして、クォートなしで、直接コマンドを記述するのではないでしょうか?

この回答への補足

回答ありがとうございます。
su abcdef -c './GHI'; err=$? でも
su - abcdef -c ./GHI; err=$? でも結果はやはり
「./GHI」の結果がerrに入るようにはなりませんでした。
「./GHI」は必ずエラー(1)を返すようにして
su - abcdef -c './GHI;echo $?'; echo $? とすると

1
0

という結果になります。
クォートの中でステータスを判定せよ!ということなのです。
一旦、ファイルに書き出さないで済む方法だけでも分かれば有難いんですが。
もう少し調査してみます。

補足日時:2004/06/11 10:08
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/14 09:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!