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는 대상 노드에 직접 연결됩니다).

관련 정보