![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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系です。
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>&-
で多分できると思います(多分…)。
回答ありがとうございました。
err=`su abcdef -c './GHI; echo $?'`
で対処できそうです
「なるほど!」と思いました勉強になりました
ありがとうございました。
No.4
- 回答日時:
うちのボスに聞いたところ、そういうバグバグなシステムを使ったことがある...とのことで、そのときはシェルのバグだったそうです。
それでsu abcdef -c 'exec ./GHI'
というようにexecを付けたら行けたそうです。try&errorしても時間の無駄だからソースを読みなさいといわれてしまいました(^^; Miracle-LinuxってLinux版ORACLEのためにチューニングされたdistroでしたっけ?ソースはFTPサイトには見つからないようですが...。
この回答への補足
回答ありがとうございました
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 ]
と書くほうが間違いが少ないかも。
この回答への補足
回答ありがとうございます。
[と!の間はスペースですね、記述ミスしていました実際は入っていると考えてください。
#1の補足にも書きましたが..
「./GHI」は必ずエラー(1)を返すようにして
su - abcdef -c './GHI;echo $?'; echo $? とすると
1
0
という結果になります。
クォートの中でステータスを判定せよ!ということなのですしょうね。
もう少し調べてみます。
今回は、#3のかたの方法で進めようと思います。
しかし、記述ミスの指摘などたいへん貴重なご意見をいただきましてありがとうございました。
No.1
- 回答日時:
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
という結果になります。
クォートの中でステータスを判定せよ!ということなのです。
一旦、ファイルに書き出さないで済む方法だけでも分かれば有難いんですが。
もう少し調査してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- UNIX・Linux Linuxのシェル関数を作成して要件を満たす方法 1 2022/11/19 20:33
- その他(プログラミング・Web制作) ログインシェル時のSHELL環境変数 1 2022/06/08 19:21
- UNIX・Linux テキストエディタのVimもEmacsも飽きたし病んでしまいました。助けてください。 5 2023/07/05 15:56
- Mac OS PATHを使ってcdなどで簡単に移動できるようになりたい 3 2023/05/13 14:22
- UNIX・Linux Kali Linuxで起動できない - Minimal BASH Like Line Editing 1 2022/06/03 13:14
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- UNIX・Linux UNIX manページとか見る頻度高いの? 特にCLIばかり使っている人のなかで というかCLIとか 3 2023/05/22 17:06
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- その他(車) 自分に合うガソリンスタンドは? 8 2023/02/10 09:52
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Cシェル内でBシェルの様な関数...
-
『存在するかどうか分からない...
-
シェル 会話形式でエンターキ...
-
リナックスユーザーのファイラー
-
shellのワイルドカードについて
-
echo で ' を表示させる方法
-
BシェルとBashの違い
-
WWWメンテナンスユーザにシェル...
-
csh (tcsh)での環境変数の長さ...
-
コマンドプロンプトとかで、net...
-
Cシェルでのファイルからの入...
-
unix初心者です
-
bashに詳しい方、教えて下さい...
-
SUSEでのHave a lot of fun......
-
MacOSXでJNetHackTNGを遊ぶには?
-
シェルとカーネルについて。
-
バックスラッシュの意味がわか...
-
作業ログから時間のみを抽出
-
bashにおける $[算術式] とは?
-
psコマンド時、「-bash」の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
export と set は違うの?
-
Cシェル内でBシェルの様な関数...
-
バックスラッシュの意味がわか...
-
シェルスクリプトで #!/bin/sh ...
-
.cshrc ファイルについて
-
『存在するかどうか分からない...
-
mac os x10.6.4のターミナルでp...
-
シェルスクリプトに関する問題...
-
posixでshellを起動したとき`da...
-
シェル 会話形式でエンターキ...
-
ubuntuの端末の左にカレントデ...
-
Linuxのファイル禁止文字
-
ターミナルが全く入力できない
-
BシェルとBashの違い
-
シェルスクリプトのbashとperl...
-
Linuxシェルによる同一文字列の...
-
msys(cygwin)で、シェルスクリ...
-
シェルの変数をMySQLに送る方法...
-
lsコマンド部分一致方法
-
UNIX(hp-ux)のコマンド履歴↑↓
おすすめ情報