• ベストアンサー

"echo off"の動きをLinuxのシェルスクリプトで実現

こんにちは。 現在、Linux(RHEL5)にてシェルスクリプトを組んでいるのですが、 質問があります。 以下のように"rpm -e"を組んで実行した場合、 パッケージB.rpmが存在しない場合、 画面に「エラー:パッケージBpacはインストールされていません」 と表示されてしまいます。 echo "****** Bpacの削除をしています ******" rpm -e Bpac 画面にエラーを表示させたくないのですが、 どのようにすれば良いのでしょうか? (Windowsのecho offのようなものはありませんか?) なお、出だしのecho文(Bpacの削除をしています)は表示させたいのです。 何か方法はないでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • michton
  • ベストアンサー率100% (1/1)
回答No.1

/bin/sh をお使いでしたら, rpm -e Bpac 2>/dev/null でどうでしょうか。エラー時に何かしたい場合は, if rpm -e Bpac 2>/dev/null; then   # エラーじゃないときの処理 else   # エラーのときの処理 fi という感じです。

foelinux
質問者

補足

ありがとうございます! 無事にエラーメッセージを消すことができました。 2>/dev/null はてっきり、外部シェルを起動する場合のみしか利用できないと思っていました。 ところで、 2>/dev/nullは、 コマンド単位ではさすがに指定できませんよね? 例えば、 chcon -R -t textrel_shlib_t /opt/AAAAAlib のような、コンテキストの変更を行う場合、 変更対象が画面にずらっと表示されてしまいます。 これらの表示を消す場合、 やはり、このコマンドのみを記述したシェルを別途外だしにし、 2>/dev/nullしかないのでしょうか?

その他の回答 (1)

回答No.2

補足に対する補足。 コマンド自体が出すメッセージではなくシェルが出すメッセージは 2>/dev/null で消すことはできませんが、その行全体をサブシェルにしてしまえば 全体に 2>/dev/null をつけることで表示されなくできます。 (                   #エラーメッセージを出したくない行 ) 2>/dev/null

foelinux
質問者

お礼

ありがとうございます! 実際に行ってみたところ、エラーメッセージを消すことができました。 シェルスクリプトとはいえ、 色々と奥が深いのですね・・・。勉強になります

関連するQ&A

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • Linuxの次のシェルスクリプトについて

    Linuxの次のシェルスクリプトについておしえてください。 ------------------------------------------ echo $USERPASS | passwd --stdin $USERNAME ------------------------------------------ echo $USERPASSが表示なのはわかります | がパスなので表示がpasswdの入力になるのもわかります --stdinがそれを受けとってるらしいのもわかります $USERPASS、$USERNAMEの意味もわかります でもなんだか「passwd --stdin $USERNAME」がよくわからないんです。 「passwd $USERNAME --stdin」と書いても同じ結果になるし、2個も3個も受け取るときはどう書けばいいのか 「--stdin」の説明を探したんですが見つかりません どなたか教えてください

  • シェルスクリプトでのechoについて

    お世話になっております。 echo文を使用して変数内に格納された文字列をファイルに追記しようとするとエラーが発生します。 エラーが発生している構文: echo $add >> $file エラー内容: read.sh: line 89: /etc/ntp.conf: そのようなファイルやディレクトリはありません エラー発生時の変数の中身: $add → server 192.168.1.1 $file →/etc/ntp.conf 同シェルスクリプト内のほか箇所では、echo文を使用しての追記は正常に行えております。 また、/etc/ntp.confは存在しており、catコマンドで内容の出力ができることを確認できております。

  • Linuxのシェルスクリプトについて

    最近Linuxの使い方を勉強し始めたのですが シェルスクリプトについてわからないところがあるので教えてください。 カレンダーを出力するスクリプト #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done というcal.shという名前のスクリプトを作りました。 ./cal.sh x y z (x,yは年数、zは何年飛ばしで表示するかを指定する引数です) と実行すると問題なくカレンダーが表示されるのですが x,y,zの値に不適切な入力値がある場合や、引数の数が2つより少ない場合 使い方を示すメッセージを出力してプログラムを終了するようにしたいです どうすればいいのかわかりません。 本当に困っています。 親切な方のご回答をお待ちしています。

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • シェルスクリプトで配列が使えない

    シェルスクリプトを利用するときに変数を配列として扱えるという記述を見たので、 以下のようなシェルスクリプトを作成したのですが、エラーが出てきてしまいます。 端末で直接入力すると、正しく動作します。そのためなぜエラーとなるのかわかりません。 環境はubuntu 10.10、 GNU bash, バージョン 4.1.5(1)-release (i686-pc-linux-gnu) です。 ---------------------- #!/bin/sh list=(`ls`) echo ${list[0]} ---------------------- 3:Syntax error: "(" unexpected

  • Linuxでシェルスクリプトがフルパスだと実行できない

    Linuxでシェルスクリプトがフルパスだと実行できない こんにちは 現在linuxでシェルスクリプトを記載していて、やっと出来た!と思ったら、なぜかフルパスで実行すると失敗します。 中身は例えば #!bin/sh echo "hello" とし、ファイル名をtest.shとします。 実行時にカレントからだと上手くいきます。 ./test.sh ただし、フルパスで実行するとうまくいきません。 ./home/user/test.sh エラーは以下 bash: ./home/dv3/tet.sh:No such file or directory 所有者はrootでグループもrootにしてあります。 シェルの権限は755にして、rootで実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • Linuxのシェルについて

    いつもお世話になっております。 Linux(redhat)でのシェルスクリプトを作成したいと思いますが、あるコマンドを実行して実行成功したか失敗したかをstatusで拾う形にしたのですがうまくいきません。アドバイスをお願いします。 例: #!/bin/sh set ST = $status date ←コマンド if [ $ST == 0 ]; then echo "**************" echo "* o k *" echo "**************" exit $NORMAL else echo "**************" echo "* N G  *" echo "**************" exit $ABEND fi

  • Linuxシェルでの大量データ投入スクリプト

    Linuxシェルでの大量データ投入スクリプト パフォーマンステスト用の大量(数千万件単位)のデータを DBに投入したいと思っています。 これをLinuxシェルで作成しようと思っています。 今まではsqlplus(あ、DBはoracleです)でログインしてから 複数のSQL文をベタベタ列挙したテキストファイルを読み込んで実行したり シェルの中で1回ずつコネクションを作成して処理を行なう というどちらかの方法しか行なったことがありませんでした。 あと、PLSQLで行なう方法もやったことはありますが、今回は 勉強の意味で、Linuxシェルのみを使用して行ないたいと思っています。 今回は、以下の条件・方針で行ないたいと思っています。とりあえず。 ・すべてのSQL文を記述するのではなく、レコードごとに変化する  IDの部分だけをシェルで埋め込む方法にしたい ・コネクションは何度も接続しなおすのではなく、まとめて1回で行ないたい ・ある程度の件数ごと(実質的には500件くらい)にコミットを行ないたい ・とりあえずLinuxシェルでやってみたい ・とりあえずストアドなしでやりたい 途中まで以下のソースを作成しました。 あとはechoの部分を書き換える感じなのですが、 コネクション管理の方法がわからずつまづいています。 まずは、Linuxシェル内でのコネクション管理をすることが出来るのかどうかを 教えてください。もしできるのであればその方法等を教えてください。 出来れば具体的な記述を下記シェルに埋め込む形での解説をお願いしたいです。 よろしくお願いします。 #!/bin/sh declare -i I=10 echo 【DBコネクション取得】 until [ ${I} -eq 0 ] do echo 【ID部分を埋め込んでINSERT文作成】 echo 【INSERT文実行】 if [ `expr ${I} % 3` -eq 0 ]; then echo 【commit文】 fi I=${I}-1 done echo 【commit文】 echo 【DBコネクション切断】

  • Linux シェルスクリプト

    シェルスクリプト作成の今後の参考にしたいので 以下のスクリプトを1つでも良いので作成してみてください。 1、sono1.sh $ ./sono1 ファイル名 で、 ファイルを削除せずにあるフォルダ(例えば .box1)に移動させるスクリプト。 ただ、すでに .box1 に同名のファイルがあった場合には上書きせず、既 存のファイル、新しいファイル両方を .box1 内に保存できるようにしてください。 2、sono2.sh $ ./sono2 拡張子 で、.box2 というフォルダにあるファイルの内, 指定された拡張子をもつファイル名だけを表示するスクリプト。 3、sono3.sh 現在のディレクトリにあるファイルのうち、texファイルから生成されたフ ァイル (*.log, *.aux, *.dvi )を削除するスクリプト。 ただし、texファイルが存在しないものについては削除しない。 つまり、 333.tex 333.aux 333.dvi aaa.log が存在する場合、削除するのは 333.aux と 333.dvi だけ.