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

おすすめ記事