以下が利用可能であることを知っています。
$ my_program > output.txt
出力をファイルにリダイレクトする問題は、ファイルが64に達すると、もはやKb
ファイルに何も書き込まれなくなり、その後のすべての情報が失われることです。
どうですか?
答え1
出力を確認してくださいulimit -f
。現在のファイル制限値によって制限される可能性があります。その場合は、実行して制限を削除できますulimit -f unlimited
。
答え2
シェルはいくつかの内部制限を使用します。 Bash(使用中のシェル)では、このコマンドはulimit
リストを一覧表示するために使用されます(-aはすべてを意味します)。
$ ulimit -a
>
しかし、「パイプサイズ」(redirect()またはパイプ()の制限)を|
より低い値に設定しても、このLinuxシステムでは8(-p)に設定されていても、ストリームのサイズと転送されるデータがパイプを通るサイズは非常に大きい場合があります(1000万バイト以上)。
$ printf '%0*d' 11000111 0 | wc -c
11000111
パイプに適用される別の制限事項であり、実際の制限事項は、以下で読むことです。
$ cat /proc/sys/fs/pipe-max-size
65536
同じファイルに設定します。
$ sudo echo $((4 * 1024)) > /proc/sys/fs/pipe-max-size
ただし、上記で設定した非常に小さい値であっても、パイプの流れを制限するものではありません。上記のコマンドはまだ1000万バイト以上で動作します。
その理由は、制限が適用される理由です。一つブロックを転送できます。
このようなツールが必要です。PerlとBashを混ぜたスクリプト書く一つ詰まった。
$ ./pipesize 128 1
write size: 128; bytes successfully before error: 4096
これはパイプラインの実際の制限を示しています(リダイレクトと同じ制限)。