如何摆脱 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

该脚本应该仅在两台远程计算机(源计算机和目标计算机)之间复制权限。在源计算机和目标计算机上,有一个/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},你就只有一根输入线xargs。第二个也是同样的情况xargs。当然,你可以把所有东西都放进去find。尝试:

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

并将其输入到下一个命令中(不是进入本地 bash 循环,但将其直接输入 ssh 到目标节点)。

相关内容