bestsource

유전확장 변수를 피하는 방법은?

bestsource 2023. 4. 14. 21:57
반응형

유전확장 변수를 피하는 방법은?

ENV의 대체 문자열을 사용하여 스크립트 파일을 작성하려고 하는데 일부 파일이 빠져나가지 않도록 하고 싶다.

export PLACEHOLDER1="myPlaceholder1Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash

myvariable_1=toto$PLACEHOLDER1
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"

결과적으로 myvariable_final이 이스케이프되지 않고 init 스크립트 의존관계($remote_fs, $syslog, $network, $time)의 것으로 대체됩니다.

#!/bin/bash

myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=,"

백슬래시를 붙이려고 하면\달러 뒤에$대체는 피할 수 있지만 불필요한 백슬래시가 발생합니다.\:

export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash

myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\$\{myvariable_1},\$\{myvariable_2}\"
EOF
"

결과는 다음과 같습니다.

#!/bin/bash

myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=$\{myvariable_1},$\{myvariable_2}"

원하는/참석 결과:

#!/bin/bash

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

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

워드에서는 파라미터 확장, 명령어 대체, 산술 확장 또는 경로명 확장이 수행되지 않습니다.단어의 문자가 따옴표로 묶인 경우 딜리미터는 단어에서 따옴표를 제거한 결과이며 이 문서의 행은 확장되지 않습니다.단어를 따옴표로 묶지 않은 경우, 본 문서의 모든 행은 파라미터 확장, 명령어 대체산술 확장된다.후자의 경우 문자 시퀀스는\<newline>무시됩니다.\문자를 따옴표로 묶어야 합니다.\,$,그리고.`.

su 명령어를 사용할 때는 명령어 자체를 sigle 따옴표로 묶고 백슬래시로 $를 이스케이프합니다.플레이스 홀더 변수는 명령어 bash 컨텍스트(여기서 su 뒤에 있음)로 설정해야 합니다.그러니까 이런 거 해야 돼

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

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

반응형