web-dev-qa-db-ja.com

apt-get出力のリダイレクト

そのため、apt-getからの出力があり、他のどこにもリダイレクトできないようです。ここに私が見るもののサンプルがあります:

Sudo apt-get -qq -y --force-yes install cowsay 2>&1 > /tmp/tmp.txt

これは、16.04で実行しているサンプルコマンドです。 --force-yesをここに含めて、将来の使用のために適切な警告をシミュレートします。今、私はこのコマンドがすべてを/tmp/tmp.txtにリダイレクトすると期待しています。そして、ほとんどのコードがこれを行っています。ただし、実行すると次の結果が得られます。

$ Sudo apt-get -qq -y --force-yes remove cowsay 2>&1 > /tmp/tmp.txt
W: --force-yes is deprecated, use one of the options starting with --allow instead.

自分のファイルにもリダイレクトする警告を取得するにはどうすればよいですか?

2
Christopher

ストリームリダイレクトコマンドが間違った場所にあります。リダイレクトは右から左に解析されるため、最初に> /tmp/tmp.txtを記述し、次に2>&1を記述する必要があります。あなたが書いたように、最初にSTDOUTをファイルにリダイレクトし、その後STDERRをSTDOUTにリダイレクトします。

これは正しいコマンドです:

Sudo apt-get -qq -y --force-yes remove cowsay > /tmp/tmp.txt 2>&1

しかし、もっと簡単な代替手段があります! STDERRをSTDOUTにリダイレクトして両方をファイルに書き込む必要は必ずしもありません。STDOUTとSTDERRの両方を直接ファイルにリダイレクトする演算子もあります:&>

Sudo apt-get -qq -y --force-yes remove cowsay &> /tmp/tmp.txt

説明と詳細情報:

  • > filenameはSTDOUT(ストリーム1)をfilenameにリダイレクトします
  • 2> filenameはSTDERR(ストリーム2)をfilenameにリダイレクトします
  • &> filenameはSTDOUTとSTDERRをfilenameにリダイレクトします

同様に、出力を2番目のコマンドにパイプする場合:

  • |は、STDOUT(ストリーム1)を2番目のコマンドのSTDINにリダイレクトします
  • 2| filenameは、STDERR(ストリーム2)を2番目のコマンドのSTDINにリダイレクトします
  • &| filenameは、STDOUTとSTDERRを2番目のコマンドのSTDINにリダイレクトします
7
Byte Commander