유전확장 변수를 피하는 방법은?
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
'bestsource' 카테고리의 다른 글
Groovy Shell 경고 "prefs 루트 노드를 열거나 만들 수 없습니다..." (0) | 2023.04.14 |
---|---|
Panda를 사용하여 여러 헤더가 포함된 엑셀 시트 읽기 (0) | 2023.04.14 |
WPF ScrollViewer에서 스크롤을 터치 활성화 하는 방법이 있습니까? (0) | 2023.04.14 |
Windows에 pip을 설치하는 방법 (0) | 2023.04.14 |
Swift에서 UserDefaults를 사용하려면 어떻게 해야 합니까? (0) | 2023.04.14 |