한 스크립트에서 다른 스크립트로 쉘 인수를 이스케이프합니다.

한 스크립트에서 다른 스크립트로 쉘 인수를 이스케이프합니다.

반면 ./mysh0:

#!/bin/bash

exec ./mysh1 $*

그리고 ./mysh1:

#!/bin/bash

echo $1
echo $2
echo $3

mysh0이와 같은 매개변수를 어떻게 호출 mysh1하고 "A", "B 2" 및 "C"를 인쇄하게 됩니까?

이것을 ./mysh0 A "B 2" C절대 금물이라고 부르세요.

답변1

"$@"대신 다음 을 사용해야 합니다 $*.

exec ./mysh1 "$@"

이는 모든 위치 매개변수를 분리된 단어로 확장하는 올바른 방법입니다.

를 사용하면 $*모든 위치 매개변수가 하나의 긴 문자열로 연결됩니다. 첫 번째 값은 IFS구분 기호이고 기본 공백은 입니다 A B 2 C.

$*이제 큰따옴표 없이 사용하고 있으므로 (안전상 위험을 초래할 수 있음그리고스크립트를 질식시키세요), 쉘이 split+glob이를 실행합니다. 위에서 얻은 긴 문자열은 A, B및 4개의 단어로 나뉩니다.2C

mysh1따라서 실제로는 3개가 아닌 4개의 매개변수를 전달하게 됩니다 .

관련 정보