수년간 나를 괴롭혔던 이 문제를 해결할 시간이 왔습니다...
나는 때때로 이런 상황에 직면하며 이것이 갈 길이라고 생각합니다.
$(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
처리 ./space
및 here/foo
는 다른 줄에 출력되지만이제 이 두 줄이 매개변수를 형성합니다.:
$ printf "<%s>\n" "$(dirname $file)"
<.
here>
d. 정답을 제공하는 내부 및 외부 참조:
$ printf "<%s>\n" "$(dirname "$file")"
<./space here>
(첫 번째 인수만 처리하면 더 간단할 수 있지만 dirname
사례 a와 c의 차이는 표시되지 않습니다.)
파일 이름이 대시로 시작하는 경우 옵션으로 간주되지 않도록 dirname
(및 아마도 다른 경우에도) 추가해야 하므로 를 사용하십시오 .--
"$(dirname -- "$file")"