Arquivo Bash: nenhum arquivo ou diretório [duplicado]

1

Eu tenho o seguinte script

ssh user@host << EOF

    STATUS="$(git status)"
    SEARCH_STATUS="Not a git"

    if [[ "$STATUS" == *$SEARCH_STATUS* ]]; then
        echo "Not a git repository"
    fi

EOF

Estou recebendo o seguinte erro

-bash: line 3: file: No such file or directory

Qual corresponde a esta linha

STATUS="$(git status)"

A questão aqui é, é que a linha acima está funcionando, o git existe e está sendo executado como planejado, e armazenando a saída do comando git no STATUS, e a instrução If está executando como planejado também, qual é o eco quando o status do git corresponde à string "Não é um git" ...

o que eu não entendo é por que está jogando esse erro, alguma idéia?

    
por Jeffrey L. Roberts 09.08.2018 / 11:54

1 resposta

1

O shell está expandindo os comandos da sua máquina, não o remoto.

Cite "EOF"

ssh user@host<<'EOF'
STATUS="$(git status)"
EOF

De man bash :

Here Documents

This type of redirection instructs the shell to read input from the current source until a line containing only delimiter (with no trailing blanks) is seen. All of the lines read up to that point are then used as the standard input for a command.

The format of here-documents is:

      <<[-]word
              here-document
      delimiter

No parameter expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word. If any characters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion. In the latter case, the character sequence \ is ignored, and \ must be used to quote the characters \, $, and '.

Editar

Seu teste também está errado. Você pode usar grep para verificar se a string necessária está na saída:

ssh user@host <<'EOF'
if git status 2>&1 | grep -q 'Not a git' ; then
  echo 'Not a git repository'
fi
EOF

ou se você quiser manter o status em uma variável

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

Observe que você terá que redirecionar STDERR para STDOUT com 2>&1

Editar 2

Se você forçar bash , também poderá

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

Tenha em atenção que no macOS e no Linux obtive diferentes capitalizações de 'Not' / 'not'. Portanto, o SEARCH_STATUS é apenas ot a git e não Not a git

    
por 09.08.2018 / 12:01