반면 ./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개의 단어로 나뉩니다.2
C
mysh1
따라서 실제로는 3개가 아닌 4개의 매개변수를 전달하게 됩니다 .