Bash 파일: 해당 파일이나 디렉터리가 없습니다.

Bash 파일: 해당 파일이나 디렉터리가 없습니다.

다음 스크립트가 있습니다

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다음으로 리디렉션해야 합니다.STDOUT2>&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

관련 정보