$(command $arg)를 인용하는 올바른 방법은 무엇입니까?

$(command $arg)를 인용하는 올바른 방법은 무엇입니까?

수년간 나를 괴롭혔던 이 문제를 해결할 시간이 왔습니다...

나는 때때로 이런 상황에 직면하며 이것이 갈 길이라고 생각합니다.

$(comm "$(arg)")

그리고 내 견해가 경험에 의해 잘 뒷받침된다고 믿습니다. 하지만 더 이상 확신할 수 없습니다.주택 검사나도 결정을 내릴 수 없습니다. 둘 다:

"$(dirname $0)"/stop.bash
           ^-- SC2086: Double quote to prevent globbing and word splitting.

그리고:

$(dirname "$0")/stop.bash
^-- SC2046: Quote this to prevent word splitting.

이것의 논리는 무엇입니까?

(그런데 이것은 Shellcheck 버전 0.4.4입니다.)

답변1

을 사용해야 합니다 "$(somecmd "$file")".

따옴표가 없으면 공백이 있는 경로가 인수에서 분할되어 somecmd잘못된 파일을 대상으로 합니다. 그래서 안에 따옴표를 넣어야합니다.

출력에 공백이 있으면 somecmd분할이 발생하므로 전체 명령 대체를 따옴표로 묶어야 합니다.

명령 대체 내의 따옴표는 그 외부의 따옴표에 영향을 주지 않습니다.Bash의 자체 참조 매뉴얼은 이에 대해 명확하지 않지만BashGuide가 명시적으로 언급함. 이것POSIX의 텍스트또한 필요하기 때문에"유효한 쉘 스크립트"입장 허용 $(...):

$(command)형식의 경우 왼쪽 대괄호 다음부터 일치하는 오른쪽 대괄호까지 포함하는 모든 문자가 명령을 구성합니다. 지정되지 않은 결과를 생성하는 리디렉션만 포함하는 스크립트를 제외하고 모든 유효한 셸 스크립트를 명령과 함께 사용할 수 있습니다.


예:

$ file="./space here/foo"

ㅏ. 따옴표 없이는 dirname모두 처리 ./space하고 here/foo:

$ printf "<%s>\n" $(dirname $file)
<.>
<here>

b. 내부의 따옴표, dirname프로세스 ./space here/foo및 제공은 ./space here두 부분으로 나뉩니다.

$ printf "<%s>\n" $(dirname "$file")
<./space>
<here>

씨. 외부 따옴표, dirname처리 ./spacehere/foo는 다른 줄에 출력되지만이제 이 두 줄이 매개변수를 형성합니다.:

$ printf "<%s>\n" "$(dirname $file)"
<.
here>

d. 정답을 제공하는 내부 및 외부 참조:

$ printf "<%s>\n" "$(dirname "$file")"
<./space here>

(첫 번째 인수만 처리하면 더 간단할 수 있지만 dirname사례 a와 c의 차이는 표시되지 않습니다.)

파일 이름이 대시로 시작하는 경우 옵션으로 간주되지 않도록 dirname(및 아마도 다른 경우에도) 추가해야 하므로 를 사용하십시오 .--"$(dirname -- "$file")"

관련 정보