すべてのエラーメッセージをテキスト ファイルに送信しますか?

すべてのエラーメッセージをテキスト ファイルに送信しますか?

次のコマンドを実行しようとしています:

$ psql -d template_postgis -f /usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql 

膨大な量のエラー出力が生成されますが、シェル内ではそのうちの最後しか見ることができません。何が間違っているのかを突き止めるには、最初を見る必要があります。

... 
psql:/usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql:6065: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:/usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql:6075: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:/usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql:6081: ERROR:  current transaction is aborted, commands ignored until end of transaction block

ただし、メッセージをテキスト ファイルに送信しようとすると、次のようになります。

$ psql -d template_postgis -f /usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql > error.txt

テキスト ファイルには、次の 3 つのコマンドのみが含まれています。

SET
BEGIN
ROLLBACK

では、なぜすべての出力がテキスト ファイルに送信されないのでしょうか。また、すべての出力を確認するにはどうすればよいでしょうか。

答え1

Unix(およびその他)では、通常、STDOUTとSTDERRの2つの出力ストリームを使用します。どちらも標準ストリーム

>STDOUT をファイルにリダイレクトするだけです。

STDERRを2>ファイルにリダイレクトします (ファイル記述子が「2」であるため、「2」になります)。


実はSTDINもあり、これをリダイレクトすることができます<グラフィックそれらがどのように相互作用するのが一般的かを示します。

図

エラー メッセージは常に STDERR に出力される必要があるため (ほとんどのプログラムではこれに従います)、通常の出力とエラー出力を分離するには、次のようにします。

command > normal.log 2> err.log

同様に、STDERR を STDOUT にリダイレクトすることもできます。

command 2>&1 > out.log

手っ取り早く言えば、すべてを1つのファイルにリダイレクトすることもできます。少なくとも、ほとんどシェル。ただし、移植性に関してはこれに頼らないでください。

command &> out.log

関連情報