나는 I say "Hello, World!"
응답하려고 노력했다 bash -c
. 내가 시도한 내용은 다음과 같습니다(일부).
$ bash -c "echo I say \"Hello, World"'!'"\""
$ bash -c "echo I say "'"'"Hello, World"'!'"\""
$ bash -c "echo I say """Hello, World"""'!'
$ bash -c $'echo I say \"Hello, World!\"'
$ bash -c 'echo I say "Hello, World!"'
그들은 모두 인쇄합니다
I say Hello, World!
견적을 어떻게 표시할 수 있나요?
답변1
문제는 중첩된 따옴표가 있어 인용이 다소 복잡해진다는 것입니다. 의 인수에 대한 "전체" 참조가 없으므로 echo
모든 시도(세 번째 시도 (1)echo
제외)는 실제로 3개의 인수를 에 전달합니다.견적 삭제:
I
say
Hello, World!
중요한 점은 "outer" 명령을 해석할 때 to 매개변수의 외부 따옴표가 bash -c
제거된다는 것입니다. 내부 따옴표는 이스케이프 처리되었거나 외부 따옴표와 유형이 다르기 때문에 여전히 존재합니다.
그런 다음 bash
명시적으로 호출한 인스턴스가 해당 매개변수("내부" 명령)를 처리할 때 호출 매개변수를 해석할 때 자체적으로 따옴표 제거를 수행합니다 echo
. 따라서 귀하가 인용한 내용은 Hello, World!
이것이 고려되도록 보장할 것입니다.하나하지만 echo
동일한 프로세스에서 삭제되어 손실됩니다 echo
.
("inner") 명령 echo
에서는 변수 확장이 필요하지 않으므로 다음과 같은 작은따옴표 구문을 사용하겠습니다.
bash -c 'echo "I say \"Hello, World\"!"'
이렇게 하면 매개변수를 전달할 수 echo
있으며 큰따옴표 내에서 인용 이스케이프 처리가 예상대로 작동합니다.
(1) 세 번째 시도에서는 실제로 다음 인수 2개를 전달하고 있습니다 bash -c
.
echo I say Hello,
그리고World!
~로 이어지다4개echo
"내부" 명령으로 표시되는 매개변수입니다. 이는 """
외부 큰따옴표를 "중단"하려는 방식이 작동하지 않기 때문입니다 . 대신 이러한 큰따옴표 중 첫 번째는 인수의 시작 큰따옴표가 bash -c
공백 뒤에서 닫혀 있음을 의미합니다. 그런 다음 이는 마치 빈 큰따옴표로 묶인 문자열이 뒤에 오는 것처럼 처리됩니다.인용되지 않음 Hello,
. 이들 사이에는 공백이 없기 때문에 모두 연결됩니다.
그런 다음 다음 공백은 보호되지 않으므로 외부는 bash
이제 나머지를 두 번째 인수로 처리합니다(다시 따옴표 없이) World
, 큰따옴표로 묶인 빈 문자열, 그리고 닫혀 있지만 닫히지 않은 큰따옴표 문자열 로 시작합니다 '!'
. 제대로 닫히지 않는다는 사실은 "이벤트를 찾을 수 없음"에 대한 오류 메시지로 가려집니다. 여는 큰따옴표는 다음의 작은따옴표를 인쇄할 단일 문자로 만들고 따라서 !
더 이상 기록 참조용으로 해석되지 않기 때문입니다.
답변2
POSIX 준수에 관심이 없다면 -e
(16진수) 또는 (8진수) echo
ASCII 코드를 추가하고 인쇄하여 "
문제를 해결할 수 있습니다.\x22
\042
bash -c 'echo -e "I say \x22Hello, World\x22"'
bash -c 'echo -e "I say \042Hello, World\042"'