이 두 가지 유사한 명령 변형이 다른 출력을 제공하는 이유는 무엇입니까?

이 두 가지 유사한 명령 변형이 다른 출력을 제공하는 이유는 무엇입니까?

명령 1:

$ rm hello.txt 2>/dev/null || { echo “Couldn’t delete hello.txt” }
"Couldn't delete hello.txt"

명령 2

$ rm hello.txt 2>/dev/null || { echo 'Couldn’t delete hello.txt' }
Couldn't delete hello.txt

노트: hello.txt현재 디렉터리에 존재하지 않습니다.

답변1

첫 번째 명령

rm hello.txt 2>/dev/null || { echo “Couldn’t delete hello.txt” }

<U+201C>(왼쪽 큰따옴표), <U+2019>(오른쪽 작은따옴표) 및 (오른쪽 큰따옴표) 문자를 포함합니다. 이러한 문자 <U+201D>는 쉘에 대해 특별한 내용이 없으며 그대로 출력됩니다.

두 번째 순서

rm hello.txt 2>/dev/null || { echo 'Couldn’t delete hello.txt' }

작은따옴표로 묶인 문자열을 포함합니다. 와 n사이의 문자 는 셸에 특별하지 않습니다.t<U+2019>

답변2

이 쌍 “”스마트 견적. 마찬가지로 귀하의 in은 Couldn’t현명한 인용문입니다.

일반적인 명언과는 다르기 때문에곱슬인용된 부분의 시작과 끝을 구별하세요.전부는 아니더라도 대부분의 프로그래밍/스크립팅 언어에서는 의미가 없습니다.다른 유니코드 문자와 동일하게 작동한다는 것을 알고 있습니다.

따라서 첫 번째 항목에는 echo실제로 참조가 없으며 명령은 다음 단어를 수신합니다.별도의 매개변수로. 쉽게 확인할 수 있어요

$ for s in “Couldn’t delete hello.txt”; do echo $s; done
“Couldn’t
delete
hello.txt”

$ for s in 'Couldn’t delete hello.txt'; do echo $s; done
Couldn’t delete hello.txt

실제로출력이 잘못되었습니다(실제로 복사하여 붙여넣었나요?) 둥근 따옴표가 에 있으므로 echo출력은 위의 예와 같이 여전히 둥근 따옴표여야 합니다.

보시다시피 두 번째 경우는하나의문자열에 ASCII 범위 밖의 유니코드 문자가 포함되어 있으므로 따옴표는 셸에서 제거됩니다.

바라보다큰 따옴표는 무엇입니까? 내 코드에서 사용할 수 있나요?

관련 정보