programing

bash 세레도크 내의 변수 사용

starjava 2023. 4. 22. 08:21
반응형

bash 세레도크 내의 변수 사용

배시 유전자의 내부에 변수를 삽입하려고 합니다

var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF

이 동작은 예상대로 되지 않습니다($var확장되지 않고 문자 그대로 처리됩니다).

사용할 필요가 있다sudo tee파일을 만들려면 sudo가 필요하기 때문입니다.다음과 같은 작업을 수행합니다.

sudo cat > /path/to/outfile <<EOT
my text...
EOT

동작하지 않습니다.>outfilesudo를 사용하지 않는 현재 셸의 파일을 엽니다.

첫 번째 질문에 대한 답변으로 딜리미터를 따옴표로 묶었기 때문에 파라미터 대체는 없습니다.bash 매뉴얼에는 다음과 같이 기재되어 있습니다.

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

      <<[-]word
              here-document
      delimiter

워드에서는 파라미터 확장, 명령어 대체, 산술 확장 또는 경로명 확장이 수행되지 않습니다.단어의 문자가 따옴표로 묶인 경우 딜리미터는 단어에서 따옴표를 제거한 결과이며 이 문서의 행은 확장되지 않습니다.단어를 따옴표로 묶지 않으면 이 문서의 모든 행이 매개 변수 확장, 명령 대체 및 산술 확장됩니다. [...]

사용할 첫 번째 예를 변경하는 경우<<EOF대신<< "EOF"효과가 있다는 걸 알게 될 거야

두 번째 예에서는 셸이 호출합니다.sudo매개 변수를 사용하여만cat리다이렉션은 의 출력에 적용됩니다.sudo cat원래 사용자로 사용합니다.다음과 같이 시도하면 효과가 있습니다.

sudo sh -c "cat > /path/to/outfile" <<EOT
my text...
EOT

따옴표 사용 안 함<<EOF:

var=$1
sudo tee "/path/to/outfile" > /dev/null <<EOF
Some text that contains my $var
EOF

변수 확장은 here-docs 내의 기본 동작입니다.이 동작을 무효로 하려면 , 라벨에 따옴표를 붙입니다(단일 따옴표 또는 이중 따옴표 포함).

이전 답변의 늦은 귀결로서 모든 변수를 보간할 수는 없지만 일부 변수를 보간할 수 있는 상황이 될 수 있습니다.백슬래시를 사용하여 달러 기호와 백틱을 이스케이프하거나 정적 텍스트를 변수에 넣을 수 있습니다.

Name='Rich Ba$tard'
dough='$$$dollars$$$'
cat <<____HERE
$Name, you can win a lot of $dough this week!
Notice that \`backticks' need escaping if you want
literal text, not `pwd`, just like in variables like
\$HOME (current value: $HOME)
____HERE

데모: https://ideone.com/rMF2XA

견적 메커니즘은 다음과 같습니다.\____HERE또는"____HERE"또는'____HERE'--는 모든 변수 보간을 해제하고 여기서 설명하는 텍스트를 리터럴 텍스트로 바꿉니다.

일반적인 작업은 로컬 변수를 다른 셸, 프로그래밍 언어 또는 원격 호스트에 의해 평가되어야 하는 스크립트와 결합하는 것입니다.

local=$(uname)
ssh -t remote <<:
    echo "$local is the value from the host which ran the ssh command"
    # Prevent here doc from expanding locally; remote won't see backslash
    remote=\$(uname)
    # Same here
    echo "\$remote is the value from the host we ssh:ed to"
:

언급URL : https://stackoverflow.com/questions/4937792/using-variables-inside-a-bash-heredoc

반응형