ProgramingTip

heredoc 확장 변수를 피하는 방법은 무엇입니까?

bestdevel 2020. 12. 10. 20:58
반응형

heredoc 확장 변수를 피하는 방법은 무엇입니까?


이 질문에 이미 답변이 있습니다.

ENV의 대체 암호화를 사용하여 펼쳐 파일을 만들려고하지만 일부가 이스케이프되는 것을 방지하고 싶습니다.

export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          my-script
# Required-Start:    \$remote_fs \$syslog
# Required-Stop:     \$remote_fs \$syslog
# Should-Start:      \$network \$time
# Should-Stop:       \$network \$time
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6
# Short-Description: blabla
# Description:       bla bla desc
#
### END INIT INFO
#
myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"

myvariable_final 이 이스케이프되지 않고 초기화 스크립트 종속성 ($ remote_fs, $ 시스템 로그, $ 네트워크, $ 시간) 것으로 대체되지의 않으므로 좋지 않습니다.

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          my-script
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: blabla
# Description:       bla bla desc
#
### END INIT INFO
#
myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=,"

\뒤 6 달러 (cad) 백 슬래시를 넣으려고 $하면 대체를 피할 수 있지만 원치 않는 백 슬래시가 발생합니다 \.

export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          my-script
# Required-Start:    \$\remote_fs \$\syslog
# Required-Stop:     \$remote_fs \$syslog
# Should-Start:      \$network \$time
# Should-Stop:       \$network \$time
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6
# Short-Description: blabla
# Description:       bla bla desc
#
### END INIT INFO
#
myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\$\{myvariable_1},\$\{myvariable_2}\"
EOF
"

결과 :

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          my-script
# Required-Start:    $\remote_fs $\syslog
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: blabla
# Description:       bla bla desc
#
### END INIT INFO
#
myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=$\{myvariable_1},$\{myvariable_2}"


원하는 / 유인 결과 whould :

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          my-script
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: blabla
# Description:       bla bla desc
#
### END INIT INFO
#
myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=${myvariable_1},${myvariable_2}"

아래와 같이 EOF따옴표로 묶고 필요할 때 이스케이프를 제어하기 위해 백 슬래시를 사용하여 해결되었습니다.

export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << 'EOF' > /etc/init.d/my-script
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          my-script
# Required-Start:    \$remote_fs \$syslog
# Required-Stop:     \$remote_fs \$syslog
# Should-Start:      \$network \$time
# Should-Stop:       \$network \$time
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6
# Short-Description: blabla
# Description:       bla bla desc
#
### END INIT INFO
#
myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"

'EOF'변수가 확장되지 않도록 하려면 다음 사용 하십시오.

sudo /bin/su -c "cat << 'EOF' > /etc/init.d/my-script
#                       ^   ^

에서 man bash:

여기 문서

이 유형의 재 지정은 구분 기호 만 포함 된 행 (후행 공백 없음)이 표시 될 때까지 현재 소스에서 입력을 읽도록 쉘에 지시합니다. 그 지점까지 읽은 모든 행은 명령의 표준 입력으로 사용됩니다.

여기 문서의 형식은 다음과 같습니다.

      <<[-]word
              here-document
      delimiter

매개 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어에서 수행되지 않습니다. 단어의 문자가 인용 된 경우 구분 기호는 단어에서 인용 부호를 제거한 결과이며 here-document의 행은 확장되지 않습니다. 단어가 인용되지 않으면 here-document의 모든 행이 매개 변수 확장, 명령 대체 및 산술 확장의 대상이 됩니다. 후자의 경우 문자 시퀀스 \는 무시되며 \, $ 및`문자를 인용하는 데 \를 사용해야합니다.


su 명령을 사용할 때 명령 자체를 작은 따옴표로 묶고 백 슬래시로 $를 이스케이프하십시오. 자리 표시 자 변수는 명령 bash 컨텍스트 (여기서는 su 뒤)에서 설정해야합니다. 그래서 당신은 같은 sth를해야합니다

su -c 'ph="ph"; cat << EOF > script 
varinscript=$ph
var=\${var}
EOF'

참고 URL : https://stackoverflow.com/questions/27920806/how-to-avoid-heredoc-expanding-variables

반응형