여러 원격 컴퓨터에서 여러 가지 작업을 수행해야하는 스크립트가 있습니다. heredoc 이이 작업을 수행 할 것이라고 생각했지만 스크립트의 다른 곳에 정의 된 변수 와 heredoc에 정의 된 변수를 사용할 수 없습니다 .
다음은 몇 가지 코드입니다.
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
EOF
이것은 다음을 인쇄합니다.
FOO =
바 = 바
그러나 EOF 줄을 ssh some.remote.host << "EOF"
다음 과 같이 인용
하면 다음과 같이 인쇄됩니다.
FOO = 푸
바 =
heredoc 내에서 두 변수를 모두 사용하는 방법에 대한 힌트가 있습니까?
감사.
답변
간단히 말해서 다음을 사용하십시오.
- 인용되지 않은 heredoc 키워드 (예 :
EOF
- 외부 (예 : 로컬 ) 변수에 대한 일반 달러 문자 (예 :
$FOO
- 내부 (예 : 원격 ) 변수에 대해 이스케이프 처리 된 달러 문자
\$BAR
당신은 히어 닥 키워드를두면 (즉 EOF
) 그 때문에 히어 닥 몸이 로컬로 처리 한 후 인용 부호로 둘러싸 $FOO
로 확장 foo
하고 BAR
빈 문자열로 확장됩니다. 그러면 당신의 ssh
명령은 :
BAR="bar"
echo "FOO=foo"
echo "BAR="
heredoc 키워드를 인용하면 변수 확장이 억제되므로 ssh
명령이 다음과 같이됩니다.
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
때문에 FOO
아마 원격 쉘 환경에 정의되지 않은, 표현은 "FOO=$FOO"
로 평가된다 "FOO=''"
즉이 FOO
빈 문자열로 설정됩니다.
두 변수를 모두 사용하려면 heredoc 키워드를 따옴표로 묶어 로컬로 정의 된 변수에 대해 변수 확장을 수행 한 다음 원격으로 확장하려는 변수를 백 슬래시로 이스케이프 처리해야합니다. :
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=\$BAR"
EOF
이 경우 원격 서버에서 수신 한 ssh 명령은 다음과 같습니다.
BAR="bar"
echo "FOO=foo"
echo "BAR=$BAR"