다음 스크립트가 있습니다
ssh user@host << EOF
STATUS="$(git status)"
SEARCH_STATUS="Not a git"
if [[ "$STATUS" == *$SEARCH_STATUS* ]]; then
echo "Not a git repository"
fi
EOF
다음 오류가 발생합니다.
-bash: line 3: file: No such file or directory
이 라인에 해당합니다
STATUS="$(git status)"
여기서 문제는 위의 줄이 작동하고 있고 git이 존재하며 예약된 대로 실행되고 git 명령의 출력이 STATUS에 저장되고 If 문도 예약된 대로 실행되어 git 상태가 "Not a git"과 일치한다는 것입니다. 끈...
내가 이해하지 못하는 것은 왜 이 오류가 발생하는지입니다. 어떤 아이디어가 있습니까?
답변1
쉘은 원격 시스템이 아닌 사용자 시스템의 명령을 확장합니다.
견적 "EOF"
ssh user@host<<'EOF'
STATUS="$(git status)"
EOF
에서 man bash
:
여기에 파일
이러한 유형의 리디렉션은 구분 기호만 포함된 줄(후행 공백 없음)이 나타날 때까지 현재 소스에서 입력을 읽도록 셸에 지시합니다. 이 지점까지 읽은 모든 행은 명령의 표준 입력으로 사용됩니다.
이 문서의 형식은 다음과 같습니다.
<<[-]word here-document delimiter
매개변수 확장, 명령 대체, 산술 확장 또는 단어에 대한 경로 이름 확장을 수행하지 않습니다. Word에 인용된 문자가 있는 경우 구분 기호는 Word에서 인용문을 제거한 결과이며 문서의 줄은 여기에서 확장되지 않습니다. 단어를 따옴표로 묶지 않으면 문서의 모든 줄에 매개변수 확장, 명령 대체 및 산술 확장이 적용됩니다.. 후자의 경우 문자 시퀀스 \는 무시되며 \는 \, $ 및 ` 문자를 인용하는 데 사용해야 합니다.
편집하다
당신의 테스트도 잘못되었습니다. grep
다음을 사용하여 필요한 문자열이 출력에 있는지 확인할 수 있습니다 .
ssh user@host <<'EOF'
if git status 2>&1 | grep -q 'Not a git' ; then
echo 'Not a git repository'
fi
EOF
또는 변수에 상태를 유지하려는 경우
ssh user@host <<'EOF'
STATUS=$(git status 2>&1)
if echo $STATUS | grep -q 'Not a git' ; then
echo 'Not a git repository'
fi
EOF
STDERR
다음으로 리디렉션해야 합니다.STDOUT
2>&1
편집 2
억지로 하면 bash
괜찮아
ssh user@host bash <<'EOF'
STATUS=$(git status 2>&1)
SEARCH_STATUS="ot a git"
echo "STATUS=$STATUS"
if [[ "$STATUS" == *$SEARCH_STATUS* ]]; then
echo 'Not a git repository'
fi
EOF
macOS와 Linux에서는 "Not"/"not"의 대소문자가 다르게 지정됩니다. 그러므로 SEARCH_STATUS
그것은 단지 ot a git
, 단지 가 아니라Not a git