stdoutとstderrをファイルにリダイレクトするPOSIX互換の方法

stdoutとstderrをファイルにリダイレクトするPOSIX互換の方法

私はすべての* nixシステム(Debian、Fedora、CentOS、AIX、Arch...すべて)で実行できるようにPOSIX互換スクリプトを作成しようとしています。リダイレクトに関して、POSIXがサポートしているものとサポートしていないものは非常に混乱しています。

ls -l file missingfile &> out.txtこれをリダイレクトすると、存在しないbashstderrについて文句を言い、missingfile出力権限はfileにありますout.txt。しかし、私はこのシェルがPOSIX標準演算子以上をサポートしているので、これがうまくいくと思います。この質問の調査中に矛盾する回答が見つかりました。

このスタック交換の回答&>たとえば、、>&は非標準演算であること>>&&>>示唆しているようです。しかし、この回答some-program > some_file 2>&1POSIX規格への準拠を明示的に宣言します。これは>&、演算子(stderr&を使用する数字stdout)がPOSIXに準拠しているのに対して&>自動リダイレクトを使用し、ファイルがstderrPOSIXstdoutに準拠していることを意味しますか?いいえPOSIXと互換性がありますか?それともどちらもPOSIX規格&>であり、>&POSIX規格/POSIX規格ではありません(これら2人のうちの1人が間違っています)?

私は&フラグを完全に避けて使用することを検討しましたが、ls -l file missingfile >out.txt 2>out.txtそれ自体の問題があります。このようにコマンドを実行すると、lsシェルはファイルout.txtのオフセット0を指す2つのファイルハンドルを開きます。したがって、lsこれら2つのファイルを検索すると、メッセージの1つが破損します。

ls -l file missingfile >out.txt 2>out.txt出力は次のとおりです。

-rw-r--r-- 1 blah blah 0 Jun  3 13:18 file
ls: cannot access 'missingfile': No such file or directory

実際の出力は何ですか?

-rw-r--r-- 1 blah blah 0 Jun  3 13:18 file
le or directory

stdoutstderrPOSIX互換の方法でファイルをリダイレクトし、ファイルにリダイレクトする最善の方法は何ですか?

答え1

確認できますPOSIX仕様。言語が常にわかりやすいわけではありませんが、探しているものが何であるかを知っていれば、それがあるかどうかを確認できます。

POSIXにはリダイレクト操作が含まれています。N>&wordN<&word窒素オプションのファイル記述子番号です(デフォルトは入力の場合は0、出力の場合は1)。言葉できる:

  • ファイル記述子のリダイレクトに使用される一連の番号窒素すでに開いているもの言葉
  • 文字-、ファイル記述子を閉じる窒素

>out.txt 2>&1標準出力と標準エラーをPOSIX準拠のメソッドにリダイレクトする場合も同様ですout.txt。 POSIX以前のバージョンでも動作します。ボンシェル

>& その後にファイル名が続きます。stdoutとstderrをこのファイルにリダイレクトするいくつかのシェル(bashを含む)の拡張。

&>>&bash(およびzsh)の後にファイル名が続く同義語です。ファイル名が一連の数字であっても機能するという利点があります-(たとえば、if is digitalfoo >&"$a"と同じですが、if is isと同じ)。欠点は、POSIXと互換性がないことです。 POSIX互換シェルでは、コマンド、演算子、およびコマンドに解析されます。つまり、印刷用のバックグラウンドプロセスとファイルを作成または削除するためのフォアグラウンドプロセスです。foo 1>&3 2>&1a3foo >myfile 2>&1amyfileecho foo &>barecho foo&>barfoobar

関連情報