왜 wc <<<“$ string”이 printf“$ string”보다 1 바이트 길이가 더 긴 이유 | 화장실?


11

분명히, 나는 wcbash에서 입력을 얻는 방법에 따라 다르게 계산됩니다.

$ s='hello'
$ wc -m <<<"$s"
6
$ wc -c <<<"$s"
6
$ printf '%s' "$s" | wc -m
5
$ printf '%s' "$s" | wc -c
5

이 IMHO 혼란스러운 행동이 어딘가에 기록되어 있습니까? wc여기에서 무엇을 계산합니까-이것이 새로운 줄 바꿈입니까?


3
당신은 항상 od -c당신이 가지고있는 것을 정확하게 볼 수 있습니다.
Thorbjørn Ravn Andersen 님이

또는 더 좋습니다 xxd -g1.
Ruslan

1
나는 printf "$s"당신의 실제 대본이 printf "%s" "$s"
아니길

printf에 대한 의견이 너무 많았으므로 모범 사례를 반영하도록 게시물을 수정했습니다.
rexkogitans

답변:


38

차이점은 here 문자열에 줄 바꿈이 추가되어 발생합니다. Bash 매뉴얼을 참조하십시오 :

결과는 표준 입력 (또는 n 이 지정된 경우 파일 설명자 n) 의 명령에 개행이 추가 된 단일 문자열로 제공됩니다 .

wc 같은 방식으로 계산하지만 입력이 다릅니다.


7
줄 바꿈 문자가 추가되지 않은 변수의 (임의의) 내용을 인쇄하려면 변수 가 포함 되거나 백 슬래시 문자 (또는 슬래시 문자)의 값에 대해 올바르게 작동 하지 않는 printf %s "$var"(또는 print -rn -- "$var"ksh와 같은 쉘) 대부분의 구현으로 시작하십시오 ). printf "$var"$var%-
Stéphane Chazelas

Unix 포트의 원래 here-string 구현은 rc줄 바꿈 문자를 추가하지 않았습니다.
Stéphane Chazelas

26

here-string 리디렉터에 의해 추가 된 후속 줄 바꿈입니다.

$ s="hello"
$ hexdump -C <<<"$s"
00000000  68 65 6c 6c 6f 0a                                 |hello.|
00000006
$ printf "$s" | hexdump -C
00000000  68 65 6c 6c 6f                                    |hello|
00000005
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.