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과 함께 실패하고 오류 메시지도 표시되지 않지만 이동하려고 했던 파일이 사라졌습니다. 그래서 여기에 두 가지 질문이 있습니다.
- 왜 실패했나요? 명령줄에서 동일한 작업을 시도하면
작동합니다. - 실패하면 이동하려는 파일이
사라지는 이유는 무엇입니까? 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