考えると:
- https://linuxcommand.org/lc3_man_pages/readh.html
- https://man7.org/linux/man-pages/man2/read.2.html
- https://git.savannah.gnu.org/cgit/coreutils.git/tree/src
- https://stackoverflow.com/a/60869467/15603477
cat filename | while read i
do
echo $i
done
他のすべての答えは失敗しました。これは動作します!これにより、テキストファイルが1行ずつ切り捨てられます。
主な部分についてもっと知りたいです。読む。しかし、ソースコードが見つかりません。
which read
出力がありません。この文脈で「読む」とは何ですか?
答え1
これはうまくいきます
そうではありません。その行はread
シェルの規則に従って解析され、再構成されます。例えば、
echo ' hello world ' |
( read x; echo ">$x<" )
キャプチャされたコンテンツには先行スペース$x
または末尾のスペースはありません。
>hello world<
(結果を変更しread x
てIFS= read -r x
比較します。)また、変数を二重引用符なしで使用すると、さらに$x
処理されます。例えば、
touch a b c # Create three empty files
x='here is my star: *'
echo "$x" # Outputs: here is my star: *
echo $x # Outputs: here is my star: a b c
あなたの場合、ファイルはa
現在のb
ディレクトリc
のファイルセットで補完されます。 (touch
副作用として空のファイルのみが生成されることを指摘する必要があります。ファイルがすでに存在する場合は、最後の修正時刻のみが更新されます。今そして決して切り取られたり、再生成されません。 )
結局、$x
ループがサブシェルにあるため、ループの外側の値は使用できなくなります。 (x='demo'
ループが始まる前に設定し、echo "$x"
ループが終わった後に設定します。ループの影響を受けません。)この場合、ファイルはcat
1つだけなので、必要はありません。
while IFS= read -r x
do
printf '%s\n' "$x"
done <filename
ただし、多くのツールがとにかくファイルを1行ずつ処理するため、通常はこのように入力を繰り返す必要はありません。比較する
cat filename
答え2
これはread
シェル組み込みコマンドです。POSIXで指定。 Bashの実装は次のとおりです。Bashのマニュアルに記載されている、そのソースコードは次のとおりです。Bashリポジトリの一部。