失敗したコマンドの出力に対処する方法

失敗したコマンドの出力に対処する方法

重複の可能性あり:
コマンドラインで tail からテキストを実行する最も簡単な方法は何ですか?

実行に失敗したコマンドの出力は stdout に送信され、パイプできるはずだと推測していました。間違っているようですので、訂正してください。

例えば、

$easy_install
The program 'easy_install' is currently not installed.  You can install it by typing:
sudo apt-get install python-setuptools

提案されたコマンドでインストールしたい場合は、

$easy_install | grep sudo | bash

つまり、単純に最後の行を取り出し、それをコマンドとしてシェルに送ろうとするのです。

$easy_install | tail -1 | bash

しかし、何もせずに同じ宣伝文句が表示されます。何が間違っているのでしょうか?

答え1

問題の行はコマンドなので、私が考えられる最も簡単な方法は次のとおりです。

`$easy_install 2>&1 | grep sudo`

バックティックまたは$(…)コマンド パイプの出力を取得し、入力したかのように実行して、出力を返します。

sudoこのコマンドは、不足していてインストールしようとしている場合は機能しないことに注意してください。ただし、これは明らかに Ubuntu なので、sudo通常は利用可能です。これを回避するには、2 番目の選択肢を試すことをお勧めします。

`$easy_install 2>&1 | tail -n 1`

の使用をやめてみてくださいtail -1。 は標準形式の に置き換えられますtail -n 1。 私自身、これは難しいと感じていますが、非推奨の警告は好きではありません。 :)

警告: もし$easy_install 存在するこのような出力が得られない場合、これらのコマンドのいずれかが大規模セキュリティリスク。勝手なことを実行してしまう可能性があります。もっと大胆な行動を取ることで、自分自身を守ることができます。

`$easy_install 2>&1 >/dev/null | grep '^sudo apt-get install'`

これにより、 が破棄されstdout、 で始まるものだけが実行されるためsudo apt-get install、うまく制限されますが、自分で入力するよりもかなり面倒ですsudo apt-get install $package

答え2

エラー出力は通常、標準出力ではなく標準エラーに送られます。 を追加することでこれを検出できます2>&1

$ easy_install 2>&1 | grep sudo

そうは言っても、彼らはそれを実行するためにシェル関数を使用しており、その関数に小さな変更を加えることで、ユーザーに問い合わせてからそれを自分で実行できるようになるのではないかと思います。

関連情報