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
'ProgramingTip' 카테고리의 다른 글
여러 파일을 찾아 Linux에서 이름 (0) | 2020.12.10 |
---|---|
vim에서 bash의 현재 줄 실행 (0) | 2020.12.10 |
Kotlin에서 null 검사를하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.10 |
Docker의 HyperKit에서 생성 한 VM에 액세스하는 방법은 무엇입니까? (0) | 2020.12.10 |
Sequel Pro 및 MySQL 연결 실패 (0) | 2020.12.10 |