cat
がこれを実行できることはわかっていますが、その主な目的は、コンテンツを表示するだけではなく連結することです。
less
とmore
についても知っていますが、ファイルの内容をターミナルに出力するだけの簡単な(ページャーではない)を探しています。そういうものがあったら、これのために特別に作られました。
最も明白なのはcat
です。ただし、head
とtail
も確認してください。ファイルを1行ずつ印刷する他のシェルユーティリティもあります:sed
、awk
、grep
。しかし、それらはファイルの内容を変更したり、ファイル内を検索するためのものです。
私はいくつかのテストを行って、どれが最も効果的なものかを見積もりました。私はすべてのトラフstrace
を実行して、システムコールが最も少ないものを確認しました。私のファイルには1275行あります。
awk
:1355システムコールcat
:51システムコールgrep
:1337システムコールhead
:93システムコールtail
:130システムコールsed
:1378システムコールご覧のように、cat
はファイルを連結するように設計されていても、最速で最も効果的なファイルです。 sed
、awk
およびgrep
は、ファイルを1行ずつ出力したため、1275を超えるシステムコールが発生します。
cat
がこれを実行できることはわかっていますが、その主な目的は、コンテンツを表示するだけではなく連結することです。
cat
の目的はまさにそれであり、ファイルを読み取ってstdoutに出力します。
zsh
の下で
<file
ファイルを印刷する最も短い方法だと思います。 'hidden' cat
(またはstdoutがターミナルの場合はmore
)を使用しますが、印刷に使用されるコマンドはREADNULLCMD
変数によって制御され、コマンドで直接上書きしても安全です名前、または関数によって。たとえば、行番号の付いたファイルを印刷するには、次のようにします。
numcat() { nl -s'> ' -w2 - }
READNULLCMD=numcat
<file
私はこれが過去形の質問であることを知っています。技術的には、ファイルの内容をstdout
に出力することは連結の形式であるため、cat
が意味的に適切です。 printf
は意味的にデータのフォーマットと印刷を目的としていることを忘れないでください。 Bashは、ファイルからの入力と出力をリダイレクトする構文も提供します。これらの組み合わせはこれを生成するかもしれません:
printf '%s' "$(<file.txt)"
POSIXは cat を次のように定義します:
[〜#〜]名前[〜#〜]
cat-ファイルを連結して印刷する
[〜#〜] synopsis [〜#〜]
猫[-u] [ファイル...]
[〜#〜]説明[〜#〜]
Catユーティリティは、ファイルを順番に読み取り、その内容を同じ順序で標準出力に書き込みます。
したがって、ここではconcatenateはファイルを順番に読み取ることを意味すると思います。
bash
ビルトインを使用してサブプロセスの作成を回避する:
{ while IFS='' read -rd '' _bcat_; do printf '%s\0' "${_bcat_}"; done; printf '%s' "${_bcat_}"; unset _bcat_; } <'/path/to/file'
IFS
はread
コマンドにのみ適用されるため、グローバルなIFS
の変更を心配する必要はありません。
Null文字の処理にはループが必要です(StéphaneChazelasに感謝)。
ファイルの内容が最初に変数(つまりメモリ)に読み込まれるため、この方法は大きなファイルには適していません。ところで、私はこの方法で39Mのテキストファイルを印刷しようとしましたが、bashのメモリ使用量は5Mを超えていなかったため、このケースについては不明です。
また、速度が遅く、CPUが非効率的です。同じ39Mファイルの場合、シングルコアの使用率が100%で約3分かかりました。
大きなファイルまたはバイナリの場合、cat '/path/to/file'
あるいは dd if='/path/to/file' bs=1M
可能なら。
デモンストレーションと同じように、
cp foo /dev/stdout