기본 스크립트에서 스크립트를 생성하는 데 문제가 있습니다.
매우 간단합니다:
cat pippo << EOF
LOGFILE=test.log
echo '#############################' >> $LOGFILE
EOF
. 그러나 pippo를 확인하면 다음과 같은 결과가 나타납니다.
LOGFILE=test.log
echo '#############################' >>
EOF
$LOGFILE이 대체된 이유는 무엇입니까?
답변1
기본적으로 여기에 있는 문서는 쉘 확장, 정확한 인수 확장, 명령 대체 및 산술 확장의 영향을 받습니다. 따라서 귀하의 경우 변수(인수) 확장이 발생합니다. 변수는 LOGFILE
현재 셸에서 확장되고 있으며 변수가 존재하지 않을 수 있으므로 확장된 값으로 null이 반환(및 대체)됩니다.
여기에 설명된 대로 문자 그대로 셸 메타 문자를 얻으려면 종결자 문자열 주위에 따옴표를 사용하십시오.
cat pippo <<'EOF' ## "EOF" would do too
LOGFILE=test.log
echo '#############################' >>"$LOGFILE"
EOF
또한 변수 확장을 인용하십시오. (아마도) 파일 이름을 참조하므로 확장 후에는 토큰화되지 않고 경로 이름이 확장되지 않습니다.
답변2
실제로 pippo
파일을 소유하려면 다음을 수행해야 합니다.
cat > pippo <<EOF
여기 문서의 값을 pippo
.
그런 다음 이 문서의 내용을 확장, 평가 또는 변경하지 않고 작성된 대로 정확하게 전송하려면 다음 중 하나를 인용해야 합니다 (부분 인용도 가능) <<
.
<<'EOF'
<<"EOF"
<<\EOF
<<E"O"F
<<E\OF
참조가 없으면 변수 값이 "$LOGFILE"
해당 값(사용자 환경에서 null로 표시됨)으로 확장되어 손실됩니다.
간단히 말해서 다음과 같이 사용하십시오.
cat > pippo << \_EOF_
LOGFILE=test.log
echo '#############################' >> $LOGFILE
_EOF_