Bashのパイプから行末 "\ r"を削除する方法

Bashのパイプから行末 "\ r"を削除する方法
#!/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

このスクリプトは、2つのリモートコンピュータ(ソースとターゲット)間の権限のみをコピーする必要があります。ソースコンピュータとターゲットコンピュータには、少数の/root/test/ファイルを含むフォルダ()があります。何らかの理由で、最初の行は\r最後に追加された内容を読みます。私はそれを取り除くためにいくつかの方法を試しましたが、役に立ちませんでした。

このエラーが発生します。

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

答え1

ああ、ループと役に立たないxargsを持つトリプルSSHパイプ、あなたはこれまでに見つけた最悪のアプローチを持っています。

あなたが\r見るのはパイプを通る改行文字の残りの部分のようです。このオプションを削除する必要があります-t。これが問題の原因である可能性があります。仮想端末に表示される出力は、通常のストリームとは異なります。

また、echo ${path1} | xargs完全に冗長であるため、実行中にfind ${path1}入力ワイヤは1つしかありませんxargs。 2番目のものも同じですxargs。もちろんすべてを入れることができますfind。努力する:

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

そしてそれを次のコマンドに入力します(いいえローカルbashループに入りますが、sshはターゲットノードに直接接続されます)。

関連情報