원격 서버의 mv 명령이 작동하지 않습니다

원격 서버의 mv 명령이 작동하지 않습니다
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)"

종료 코드 1과 함께 실패하고 오류 메시지도 표시되지 않지만 이동하려고 했던 파일이 사라졌습니다. 그래서 여기에 두 가지 질문이 있습니다.

  1. 왜 실패했나요? 명령줄에서 동일한 작업을 시도하면
    작동합니다.
  2. 실패하면 이동하려는 파일이
    사라지는 이유는 무엇입니까? MV는 원래 이런가요?

참고: 이 스크립트는 bash 쉘에서 실행되며 기본 원격 서버 쉘은 ksh입니다.

답변1

여기서 문서 구분 기호는 EOD문서의 끝을 나타내며 별도의 줄을 차지해야 합니다. 문자열 EOD)이 와 같지 않습니다 EOD.

mv실패 시 파일은 삭제되지 않습니다. $B공백 문자가 포함되어 있지 않다고 가정 하고 TXTDR변수가 원격 쉘에 의해 정의되지 않은 경우 실행되는 명령은 다음과 같습니다.

mv /$B.txt /tmp/$B

(호출하기 전에 로컬 쉘에 의해 확장됨 ), $B대상이 쓰기 가능하지 않으면 ssh삭제되지 않습니다 ./$B.txt

공백 문자가 포함된 경우 $B큰따옴표로 묶어야 합니다(예: $TXTDR그래야 함).

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

이 코드 조각으로 수행 중인 특정 작업을 수행하려면 다음과 같이 작성할 수 있습니다.

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

아니면 그냥

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

(여기서는 전혀 서류가 필요없다고 할 수 있고, 줄여서 이라고 할 수 있습니다 ssh "$user@$server" mv "..." "...")

...불필요한 텍스트를 출력하지 않습니다. 성공했는지 테스트하고 싶다면 $?이것을 살펴보세요(모든 것이 잘 되었다면 0이 될 것입니다).

이것은 또한 작동합니다:

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

관련 정보