この文脈で「読む」とは何ですか?

この文脈で「読む」とは何ですか?

考えると:

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 xIFS= 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"ループが終わった後に設定します。ループの影響を受けません。)この場合、ファイルはcat1つだけなので、必要はありません。

while IFS= read -r x
do
    printf '%s\n' "$x"
done <filename

ただし、多くのツールがとにかくファイルを1行ずつ処理するため、通常はこのように入力を繰り返す必要はありません。比較する

cat filename

答え2

これはreadシェル組み込みコマンドです。POSIXで指定。 Bashの実装は次のとおりです。Bashのマニュアルに記載されている、そのソースコードは次のとおりです。Bashリポジトリの一部

関連情報