失敗したコマンドの出力に対してアクションを取る方法

失敗したコマンドの出力に対してアクションを取る方法

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

私は失敗したコマンドの出力が標準出力に送信されなければならず、したがってパイプすることができると推測します。私が間違っているようですので訂正してください。

例えば、

$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

つまり、彼らはこれを行うためにシェル関数を使用し、その関数を少し変更するだけでユーザーに尋ねて自分で実行できると思います。

関連情報