연속 파이프라인과 명령 실행의 결과가 다른가요?

연속 파이프라인과 명령 실행의 결과가 다른가요?

나는 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 ) 

따라서 파일 수 대신 모든 파일의 줄 수를 계산합니다.
두 번째 줄을 다음으로 변경해야 합니다.

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

답변2

bash는 PowerShell(또는 내가 모르는 다른 것)이 아니고 left | right명령줄 인수로 출력된 행이나 단어를 사용하여 호출을 수행하는 대신 right내용이 다음과 같은 파이프에서 리디렉션된 stdin을 사용하여 출력이 실행됩니다. 에 기록 중입니다. 또한 순차적이 아닌 동시에 실행됩니다.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출력이 빈 줄로 끝나거나 완전히 비어 있는 경우 두 메서드의 답변이 다를 수 있다는 점도 주목할 가치가 있습니다 .

특히 $( echo "$temp" | wc -l )0은 절대 아닙니다.

관련 정보