gzip
にパイプすると、stdinを受け入れられないため、xargs
を使用してstdinを引数に変換する必要があります。
$ls
1.txt
$ls |xargs gzip && ls
1.txt.gz
全て大丈夫 。しかし、cpioアーカイブファイルを圧縮したいとき
$ls | cpio -ov | gzip > archive.cpio.gz
また、それは大丈夫であり、このls | cpio -ov | xargs gzip
は機能しません。なぜ第2の状況でgzip
はstdinを受け入れ、引数を受け入れられないのですか?
コマンドライン引数と標準入力には違いがあります。
gzip
は、引数としてfilenamesを受け入れます。指定されたファイルから生データを読み取り、それらを圧縮します。ファイル名のリストを出力するコマンドがある場合、xargs
を使用して、それらのファイル名をコマンドライン引数としてgzip
に渡すことができます。
ただし、ファイル引数がgzip
に渡されない場合、デフォルトではraw data from standard inputを読み取り、圧縮結果を標準出力に出力します。圧縮する生データを出力するコマンドがある場合は、gzip
にパイプできます。