자, "$@"
위치 매개 변수 목록으로 확장합니다. 위치 매개 변수 당 하나의 인수입니다.
할 때 :
set '' 'foo bar' $'blah\nblah'
cmd "$@"
cmd
빈 문자열 foo bar
및 이라는 세 가지 인수로 호출됩니다 blah<newline>blah
. 쉘은 execve()
다음과 같이 시스템 호출을 호출합니다 .
execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);
동일한 호출을 재현하는 쉘 명령 행 (쉘 언어의 코드)을 재구성하려는 경우 다음과 같은 작업을 수행 할 수 있습니다.
awk -v q="'" '
function shellquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
for (i = 1; i < ARGC; i++) {
printf "%s", sep shellquote(ARGV[i])
sep = " "
}
printf "\n"
}' cmd "$@"
또는로 zsh
다른 유형의 따옴표를 요청하십시오.
$ set '' 'foo bar' $'blah\nblah'
$ print -r -- cmd "${(q)@}"
cmd '' foo\ bar blah$'\n'blah
$ print -r -- cmd "${(qq)@}"
cmd '' 'foo bar' 'blah
blah'
$ print -r -- cmd "${(qqq)@}"
cmd "" "foo bar" "blah
blah"
$ print -r -- cmd "${(qqqq)@}"
cmd $'' $'foo bar' $'blah\nblah'
또는으로 zsh
, bash
또는 ksh93
(여기에 대한 bash
다른 껍질 YMMV) :
$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'
쉘의 xtrace 옵션을 사용하여 쉘이 실행할 내용을 인쇄하게 할 수 있습니다 :
$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'
위에서 우리는 :
no-op 명령과 cmd
위치 매개 변수를 인수로 실행했습니다. 내 껍질은 껍질에 다시 입력하기에 적합한 인용 된 방식으로 인쇄했습니다. 모든 껍질이 그런 것은 아닙니다.
$
확장 및 기타 큰 따옴표 를 보호하는 데별로 도움이되지 않습니다 . 그렇기 때문에 다른 답변이 작은 따옴표를 사용하는 동안 문자열 내 에서 작은 따옴표를 처리 하거나 따옴표로 묶은 문자열 복사본을 생성하기 위해 쉘 자체의 기능을 사용합니다.