Como se livrar de “\ r” a fim da linha que vem do pipeline no bash

0
#!/bin/bash
sourcenode=$1
destnode=$2
path1=/root/test
ssh root@"${sourcenode}" -t "echo "${path1}" | xargs -IDIR find DIR " |
while read line
do
        ssh root@"${sourcenode}" -t "stat -c "%a" $line | xargs -IDIR ssh root@"${destnode}" chmod DIR $line"
done

Esse script deve copiar apenas as permissões entre duas máquinas remotas: origem e destino. Nas máquinas de origem e de destino, há uma pasta ( /root/test/ ) com alguns arquivos. Por algum motivo, na primeira linha, ele adiciona \r no final. Eu tentei algumas coisas para me livrar dele, mas sem sucesso.

Eu recebo este erro.

Pseudo-terminal will not be allocated because stdin is not a terminal.
stat: cannot stat '/root/test\r': No such file or directory
    
por fuzzy186 15.04.2015 / 13:41

1 resposta

4

Oh querida, pipeline tripla ssh com loop e xargs inúteis, você encontrou a pior maneira de fazer isso.

O \r que você está vendo parece ser uma sobra da nova linha que está passando pelo canal. Você deve remover a opção -t , pode ser a causa de seus problemas. Saída destinada a exibir em terminais virtuais é diferente do fluxo normal.

Além disso, echo ${path1} | xargs é completamente supérfluo, apenas execute find ${path1} , você só tem uma linha de entrada para xargs de qualquer forma. O mesmo vale para o segundo xargs . Claro, você pode colocar tudo em find . Experimente:

ssh root@"${sourcenode}" "find ${path1} -printf 'chmod %m \"f\"\n'"

E canalize isso para o próximo comando ( NOT em um loop bash local, mas alimente-o diretamente no ssh para destnode).

    
por 15.04.2015 / 14:05