heredoc 출력을 로컬 변수로 설정하는 방법

heredoc 출력을 로컬 변수로 설정하는 방법

다음과 같이 heredoc에서 출력을 로컬 변수로 설정하려고 합니다.

REMOTE_OUTPUT=$(ssh remote@server /bin/bash << EOF
  find my/path/ -type f -not -path my/path/*/ -type f -mtime -0 | while read filename; do
        if grep "ERROR" $filename; then
            filenamebase=$(basename "$filename")
            echo -e "\n----------------------------------------------------------\n\n$filenamebase failure:\n"
            grep -n "ERROR" "$filename" | sed G
        fi
    done
EOF)

그러나 find&grep 루프가 정확하고 실제로 출력을 반환해야 하더라도 변수는 비어 있습니다.

(그렇지 않으면 heredoc의 출력을 로컬 파일에 쓰는 데에도 관심이 있습니다.)

답변1

EOF예를 들어 태그를 인용 하거나 변수가 <<\EOF원격으로 전달되기 전에 평가되는 것을 중지해야 합니다. <<'EOF'대신 say를 사용하여 $filename효과를 확인할 수 있습니다./bin/bash -v/bin/bash

EOF또한 실제 마크업을 자체 줄에 배치해야 하며 마지막 줄은 )다음 줄에 있어야 합니다.

답변2

이것은 일반적인 예이지만 대화형 nslookup을 사용하여 동일한 작업을 수행할 수 있었습니다.

output_text=`nslookup<<-monkies
      www.google.com
      exit
      monkies`
echo "Output: $output_text"

전체 명령을 물결표로 묶으면 출력을 변수에 저장할 수 있습니다. heredoc이 실행하는 명령에 따라 항상 예쁘지는 않지만 작동합니다.

이것은 heredoc 출력을 bash의 변수에 저장할 때 발생했던 문제를 해결했습니다.

관련 정보