次のスクリプトがあります
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