차이점이 뭐야? (명령 대체) [중복]

차이점이 뭐야? (명령 대체) [중복]
  1. printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
  2. printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
  3. 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하지 마세요.)

보다Bash-5.1-베타 발표 예를 들어bug-bash 메일링 리스트에 이 버그를 보고하세요..

관련 정보