mv comando no servidor remoto não está funcionando

0
B=$1
CHECK="$(ssh $USER@$LOGINHOST <<EOD
        . /path/loadprofile.sh
        if [[ ! -e \$TXTDR/$B.txt ]]; then; echo "TXT file for this job does not exist."; exit; fi
        mv \$TXTDR/$B.txt /tmp/$B
EOD)"

Ele está falhando com o código de saída 1 e não exibe nenhuma mensagem de erro, mas o arquivo que estou tentando mover desaparece. Então eu tenho duas perguntas aqui.

  1. Por que isso está falhando? Quando estou tentando mesmo da linha de comando, é
    trabalho.
  2. Se falhar, por que o arquivo que estou tentando mover
    desaparecer? É assim que o mv geralmente funciona?

NOTA: O script está sendo executado no bash shell e o shell do servidor remoto padrão é ksh.

    
por Koshur 08.02.2018 / 13:24

1 resposta

4

O delimitador here-document, EOD , que está finalizando o documento, deve estar em uma linha sozinho. A string EOD) não é igual a EOD .

mv não remove arquivos em falhas. Assumindo que $B não contém caracteres de espaço em branco e se a variável TXTDR é indefinida pelo shell remoto, o comando executado seria

mv /$B.txt /tmp/$B

(com $B expandido pelo shell local antes de ssh ser chamado), mas isso definitivamente não excluirá /$B.txt se o destino não for gravável.

Se $B contiver caracteres de espaço em branco, ele precisará ser duplicado (assim como $TXTDR deve ser):

mv "\$TXTDR/$B.txt" "/tmp/$B"

Para fazer a coisa específica para a qual você está usando este snippet de código, eu provavelmente teria escrito como

ssh "$user@$server" sh -s -- "$somepath/file.txt" <<'END_SCRIPT'
[ -e "$1" ] && mv "$1" "/new/location/${1##*/}"'
END_SCRIPT

ou mesmo apenas

ssh "$user@$server" sh -s -- "$somepath/file.txt" "/new/location/file.txt" <<'END_SCRIPT'
mv "$1" "$2"
END_SCRIPT

(que provavelmente não precisa de nenhum documento aqui e poderia ser encurtado para ssh "$user@$server" mv "..." "..." )

... sem saída de texto desnecessário. Se você quiser testar o sucesso, veja $? depois disso (seria zero se tudo corresse bem).

Isso também funcionaria:

if ! ssh "$user@$server" mv "..." "..."; then
    echo 'Something went wrong with ssh or remote mv' >&2
fi
    
por 08.02.2018 / 13:29