連続パイプラインと命令実行の結果は異なりますか?

連続パイプラインと命令実行の結果は異なりますか?

私は初めてbashに触れたので、これが愚かな場合はお詫び申し上げます。

私はフォローアップをしています。これfindHEIC画像をJPGに変換する方法のガイドです。なぜ実行してパイピングを続けると、wc他の結果が出るのか混乱します。具体的には、findwc

temp=$(find . -maxdepth 1 -name "*.HEIC")
count=$(wc -l $temp) 

$count予想通り、計算結果の単語数を含むファイルのリストが生成されました。しかし、記事のように書くと、次のようになります。

count=$(find . -maxdepth 1 -name "*.HEIC" | wc -l)

次に、.HEIC 拡張子を持つファイルの数を数えます。

答え1

から」男トイレ'

wc [オプション]...[ファイル]...

各 FILE の改行文字、単語数、バイト数を印刷するか、複数の FILE が指定されている場合は行の総数を印刷します。

count=$(wc -l $temp) 

次のように評価

count=$(wc -l /path/to/file1 /path/to/file2 ) 

したがって、ファイル数の代わりにすべてのファイルの行数を計算します。
2行目を次に変更する必要があります。

count=$(echo "$temp" | wc -l) 

答え2

bashはPowerShell(または私が知らないもの)ではなく、left | rightコマンドライン引数として出力された行または単語を使用して呼び出しを実行するのではなく、内容が次のパイプからリダイレクトされたrightstdinを使用して出力が実行されます。に記録中です。また、順次ではなく同時に実行されます。leftrightleftleftright

wc -l引数なしで呼び出すと、files単に標準入力の行数を数えます。seq 1 2 | wc -l印刷されます2

とにかくfind . ... | wc -l改行文字を含むファイル名のため、破損しやすいです。これは(残念ながら)非常に許容されます。 GNU findを使用すると、次のようにこの問題を解決できます。

count=$(find . ... -name '*.HEIC' -printf _ | wc -c)

# or just
count=$(find . ... -name '*.HEIC' -printf _); count=${#count}

答え3

$(…)echoは末尾の改行を切り取り、echoは改行を追加するので、find出力が空の行で終わるか完全に空の場合、2つのメソッドの答えが異なる可能性があることにも注意する価値があります。

特に$( echo "$temp" | wc -l )ゼロは絶対ではありません。

関連情報