• ベストアンサー
  • すぐに回答を!

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

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

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数2025
  • ありがとう数5

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

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

このスクリプトが何かの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 $?'` で対処できそうです 「なるほど!」と思いました勉強になりました ありがとうございました。

関連するQ&A

  • シェルコマンドについて

    先日自分のPCにやっとLinuxをインストールし、UNIXの勉強に励もうと思って いるのですが、基本的なシェルコマンドがまだよくわからなく苦戦しています。 もし、『シェルコマンド一覧表』みたいなのが、記載されているサイトがあるならば、URLを教えて頂けませんか?  また、効率の良いシェルコマンドの覚え方があったら教えて下さい。  宜しく御願いします!

  • 制限付きシェルについて

    UNIXのAIXのVer5.1を使用しています。 rmなどのコマンドを制限させたユーザを作りたいのですが、どのようなシェルを使えばいいか分かりません。 rbashのような機能を持ったシェルなどはないのでしょうか? もしくは、ユーザに特定のコマンドを規制することはできないのでしょうか?

  • UNIXシェルの途中でユーザー切り替え

    UNIXシェルの途中でユーザーを切り替える方法はありますか。 例)  ・ユーザAで先頭100行を実行し、残りはユーザBで実行など・・・。  ※suできれば良いのですが、対話形式のパスワード入力を促されてしまいますよね・・・。

その他の回答 (3)

  • 回答No.4

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

回答ありがとうございました 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 ] と書くほうが間違いが少ないかも。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

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

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

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

関連するQ&A

  • UNIXのシェル、環境設定について教えてください。

    こんにちは。 UNIXについて詳しく勉強したいとおもっています。 コマンドなど基本的なファイル操作についてはある程度わかるのですが、UNIXの環境設定、環境変数、シェルなどの物につまづいています。 「環境変数って一体なんだよ!」 「シェルのBシェル、Cシェルって・・・」 こんな感じです。 これらについて初心者でもわかるような本、サイトを教えてください。 あと、初心者すぎて恥ずかしい質問なのですが、UNIX系OSにはいろいろな種類があるのは知っているのですが、「UNIX」という名前のOSはあるのでしょうか? また、Teratermを使っているのですが、これって何ていう名前のOSなのでしょうか? 最後に、会社なのでは、SolarisとLinuxどちらが多く使われているのでしょうか? これらの質問に詳しい諸先輩方アドバイスの方をよろしくお願いします。

  • ログインシェルの変更について

    現在Unixを使っています。 特定ユーザでログインした際のログインユーザを自分の作ったプログラムにしたいのですが、 chshなどのコマンドを使っても、利用可能なログインシェルに登録されていないため変更できないです。 どうすればログインシェルを変更することができるでしょうか? 初歩的なことかもしれませんが、よろしくお願いします。

  • シェルの変数セットについて

    どなたか教えてください。 以下のようなUNIXのシェルを作ってみたのですが変数がうまくセットされません。 これは仕様なんでしょうか??? シェルはkshでシェルの中でsuしているユーザはcshです。 例: ==test.sh== #!/bin/ksh A1="test test" su - user1 <<EOF echo "A1 :" $A1 set A2 =(test test) echo "A2 : " $A2 EOF exit ==実行結果== %./test A1 : test test A2 : %

  • ログインシェルについて

    linuxにて/etc/passwdを閲覧すると、 /sbin/nologinというログインシェルがございります。 これは、ログインができないユーザとして割り当てられていると認識します。 1つ質問ですが、一般ユーザから例えば/sbin/nologinシェルの、 su - shutdownでスイッチするとpassword:とパスワードプロンプトが表示されます。 ということは、ログインが可能ということですか? よろしくお願いします。

  • CシェルプログラミングをCygwinで?

    csh環境でのスクリプト作成をしたいのですが、UNIX環境をWindows上で実現できる?Cygwinというものがあると知りました。Cygwinにおいてシェルプログラミングは、本物のUNIXのようにできるものなのですか? シェルがLinuxRedHat並に動作すれば充分なのですが、不足する機能などはないのですか? またシェルプログラミングを学ぶ上で充分なのか判断できないので経験者または専門家の方ご教授願います。 またCygwinは起動させると重いんでしょうか? Cygwinを分かりやすく説明しているサイトなども教えて頂けるとうれしいです。よろしくお願いします。

  • suでのコマンド実行

    Kシェルのプログラミングで以下の違いが分かりません。 su - ユーザ "-c コマンド" su - ユーザ "-c 上記コマンドをシェル化" どうゆう違いなのか詳細にご教授いただけると 助かります。 よろしくお願いします。

  • シェルでファイルのハッシュを取得する方法

    シェル(.shのファイル)でフォルダに格納されている複数のファイルからファイル名、ハッシュをとって HASH.txtというファイルに以下のようなレイアウトで作りたいのです。  ファイル名,ハッシュ     ・     ・ MD5というコマンドをつかえばハッシュがとれることは わかったのですが、これをどのようにファイルに書き込んでいくのか 方法がわかりません。 当方、UNIXをつかうのも初めてでどうしたらよいのか全然わかりません。(依頼してきた人も長期休暇中で困ってます) どこかサンプルや、解説があるようなHPでも構わないので どなたか教えてください。

  • シェルでファイルから1行づつ読み出す。

    ファイルから1行づつ読み込んで 変数に格納する方法がわかりません。 具体的に言うと・・・ ユーザIDが詰まった(1行に一人分)ファイル user.txt を1行づつ読みこんでいき、 ユーザアカウントをチェックするプログラム user_chk に引数として渡して行きたいと思っています。 簡単だと思っていたのですが、 さっぱりわかりません。 Cシェルを使用していますが、 Bシェルでもかまいません。

  • UNIXシェルの設定ファイルについて

    solaris8使用してるのですが2つほど質問があります。 1. rootのシェルの設定ファイル(.cshrcとか.profileにあたるもの?) ってどこにあるのでしょうか? su でroot になったときや、rootでcshと打ち込んだときなど はどこのファイルの設定を読むのでしょうか? 2. 一般ユーザを新規に追加した場合にその新規ユーザの シェルの設定ファイルってどこからもってきたものなんでしょうか? デフォルトのファイルのようなものをコピーしてくる感じなのでしょうか? ご存知の方よろしくお願いします。

  • ローカルネット内にてファイルをシェルで転送するには?

    初投稿させて頂きます。 パソコンが最近不安定なので、バックアップとして定時にローカルネット内の他機へファイルを転送するシェルを作りたいと考えています。 流れは、 #!/bin/bash sftp 他機のローカルアドレス ユーザー名 パスワード put file.txt こういうイメージなんですがアカウントとパスを入力するところで躓いています。検索してもUNIXのコマンド(user等)しか引っかかりませんでしたので、linuxで使える良いコマンドはありませんか。 環境はCentos5です。どうぞよろしくお願いします。