여기서 스크립트를 단순화했습니다.
#!/bin/bash
# test.sh
set -u
### test-script ###
cat <<SCRIPT > ~/test-file-output
#!/bin/bash
set -e
usage() {
cat <<EOF
Does a thing
EOF
}
for opt in "$@"; do
case $opt in
-h|--help)
usage
exit 0
;;
*)
echo "Invalid option: $opt" >&2
usage
exit 1
;;
esac
done
SCRIPT
chmod +x ~/test-file-output
상위 스크립트에 있으므로 heredoc의 하위 스크립트에 있는 var가 하위 스크립트에 설정된 값으로 set -u
캡처됩니다 .opt
opt
$@
상위 스크립트 자체의 일부가 아니기 때문에 구분된 문서의 모든 변수와 텍스트를 무시하도록 하는 방법이 있습니까? 내 생각에는 heredoc을 스크립트 구문을 기반으로 구문 분석하는 대신 거대한 문자열로 취급하는 것 같습니다.
답변1
Heredoc은 거대한 문자열이지만 종결자 문자열( SCRIPT
yours << SCRIPT
)이 인용되지 않으면 다음과 같이 작동합니다.큰따옴표문자열이므로 모든 변수가 확장됩니다. 리디렉션에서 종결자의 일부가 참조되는 경우(예 << "SCRIPT"
: ), 이는 다음과 같이 작동합니다.아포스트로피문자열이므로 변수 확장이 없습니다.
다음 스크립트를 고려해보세요.
$ cat heredoc.sh
#!/bin/bash
var=xyz
cat <<EOF
var=$var
EOF
cat <<'EOF'
var=$var
EOF
$ ./heredoc.sh
var=xyz
var=$var
첫 번째 항목은 EOF
인용되지 않았으므로 $var
확장됩니다. 두 번째는 문자열에 cat
리터럴이 포함 된다는 것입니다 $var
.