3

ユーザーにとって「透過的」であるはずのbashスクリプトを書いています。ユーザーからコマンドを読み取り、それらをインターセプトして、いくつかの基準に応じて、一部のコマンドのみをbashで実行できるようにします。それは(基本的に)次のように機能します:

while true; do
   read COMMAND
   can_be_done $COMMAND
   if [ $? == 0 ]; then
      eval $COMMAND
      if [ $? != 0 ]; then
         echo "Error: command not found"
      fi
   fi
done

問題は、コマンドが失敗すると、コンソールに印刷されたものも表示されることです。しかし、結果を変数に保持し、失敗しない場合にのみ出力する場合は、次のようになります。

RESULT=$(eval $COMMAND)

次に、別の問題があります。特別なフォーマットが失われます(たとえば、「ls --color」は色を表示しなくなります)

私の質問は、成功した場合はコマンドをSTDOUTに出力し、失敗した場合は/ dev / nullに出力する方法はありますか?

4

4 に答える 4

5

コマンドの出力をエラー メッセージに置き換える 2 番目の部分が本当に必要ですか? Linux コマンドは独自のエラー メッセージを出力しますが、これは必ずしも「コマンドが見つかりません」というわけではありません。多くの場合、誤ったエラー メッセージ (コマンドが見つかりません) を使用して、真のエラー (アクセス許可が拒否された、ファイルが見つからない、メモリ不足、セグメンテーション違反など) を隠していることになります。

そのチェックを削除すると、ループを次のように単純化できます。

while true; do
   read -e COMMAND
   if can_be_done "$COMMAND"; then
      eval "$COMMAND"
   fi
done
  • read -ereadline を使用してコマンドを取得し、プロンプトをよりシェルに似たものにします (たとえば、履歴用)
  • command; if [ $? == 0 ]; thenのように慣用的に書かれていif <command>; thenます。
  • 引用符を使用すると、特殊文字と空白が適切に処理されます。
于 2012-10-04T14:32:50.250 に答える
1

これを行うべきではないと強く主張します。出力を見たくない場合は、リダイレクトしてください/dev/null。エラーを表示したい場合は、stderr をリダイレクトしないでください。stderr ではなく stdout にエラー メッセージを出力するプログラムを使用している場合は、プログラムを修正してください。エラー メッセージは stderr に属します。これは、プログラムが壊れていることを意味することに注意してください。

 echo "Error: command not found" >&2

ルール 1 かどうかはわかりませんが、トップ 10 に入っていることは確かです。また、最も頻繁に違反されるルールかもしれません Error messages belong on stderr。stdout にエラー メッセージを出力するプログラムが壊れています。

于 2012-10-04T16:48:45.027 に答える
-1

コマンドの実行にそれほど費用がかからないと仮定すると、次のことができます。

   test `ls /mooo 2>/dev/null` || echo moo not found

test は、コマンドが 0 で終了した場合にのみ true を返します。この場合、ls がコマンドです。これを次のように if ステートメントに入れることもできます。

if [ `ls /moo 2>/dev/null` ];then 
  echo moo is a folder
fi
于 2012-10-04T14:48:35.077 に答える