printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
printf "%s" "$(echo ../.. | sed 's/[.]/\\&/g')"
답변1
내가 아는 한, 아니,이 특별한 경우에는, 그리고 문자열 ../..
.
따옴표가 있든 없든 두 번째와 세 번째 사이에는 큰 차이가 없습니다.그 특정 입력, string ../..
그러나 명령 대체의 출력에 공백이나 와일드카드가 포함되어 있으면 차이가 있습니다.
$ mkdir temp; cd temp; touch hello.txt
$ printf "%s" $(echo "foo * bar"); echo
foohello.txtbar
$ printf "%s" "$(echo "foo * bar")"; echo
foo * bar
바라보다:$(command $arg)를 인용하는 올바른 방법은 무엇입니까?
백틱 버전은 더 이상 사용되지 않으며 $(...)
rt와 다르게 작동합니다. 인용하고 탈출합니다. 백틱 내에서는 $(...)
백슬래시 세트가 명령 대체에 사용되므로 다른 결과를 얻을 수 있습니다. ( \\&
전환하면 sed 자체가 sed에 특별하고 나머지 백슬래시가 특별한 의미를 제거하므로 sed \&
인쇄가 리터럴이 됩니다 .)&
&
바라보다:$(stuff)와 `stuff`의 차이점은 무엇입니까?
또한 Bash 5.0에는 백슬래시가 있으면 문자열에 다른 실제 glob 문자가 포함되어 있지 않더라도 문자열이 glob으로 처리되기에 충분한 버그/버그 기능이 있습니다.
두 번째 명령에서 따옴표가 없는 확장의 결과는 glob으로 처리되며 \.\./\.\.
예를 들어 같은 방식으로 됩니다. (경로 이름은 에도 항상 존재해야 합니다. 물론 다른 이름도 일치할 수 있습니다.)../..
.[.]/.[.]
.?/.?
../..
/
.?/.?
마찬가지로 다음과 같이 failglob
트리거될 수 있습니다.
bash-5.0.3$ shopt -s failglob
bash-5.0.3$ echo $(echo 'xxxxxx\x')
bash5.0.3: no match: xxxxxx\x
(하지만 echo xxxxxx\x
하지 마세요.)