![FTP "put"은 쉘 스크립트에서 실행할 때 파일을 원격 호스트에 복사하지 않지만 수동으로 실행할 때는 복사합니다.](https://linux55.com/image/56421/FTP%20%22put%22%EC%9D%80%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%ED%95%A0%20%EB%95%8C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%9B%90%EA%B2%A9%20%ED%98%B8%EC%8A%A4%ED%8A%B8%EC%97%90%20%EB%B3%B5%EC%82%AC%ED%95%98%EC%A7%80%20%EC%95%8A%EC%A7%80%EB%A7%8C%20%EC%88%98%EB%8F%99%EC%9C%BC%EB%A1%9C%20%EC%8B%A4%ED%96%89%ED%95%A0%20%EB%95%8C%EB%8A%94%20%EB%B3%B5%EC%82%AC%ED%95%A9%EB%8B%88%EB%8B%A4..png)
ftp -n ${FTP_HOST} << STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}
binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}
STOP
내 코드는 다음과 같습니다. 파일을 원격 호스트에 성공적으로 복사하지 못했지만 수동으로 사용하면 파일을 원격 호스트에 성공적으로 복사합니다.
스크립트에서 실행하면 콘솔에 "(로컬 파일) 사용법: 로컬 파일 원격 파일 넣기"가 나타납니다.
무엇이 문제일까요?
답변1
나는 당신의 문제 중 일부가 구분 기호를 구성하는 방식에 있다고 생각합니다. 다음과 같이 시도해 보세요.
$ ftp -n ${FTP_HOST} << STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}
binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}
STOP
명령에서 이러한 공백/탭을 실제로 사용하려면 다음 형식의 heredoc로 변경해야 합니다.
$ ftp -n ${FTP_HOST} <<-STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}
binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}
STOP
구분된 문서에 공백/탭이 있을 때마다 for를 사용하여 <<-
그 안에 포함된 명령을 실행하기 전에 선행 공백/탭을 제거하도록 쉘에 지시해야 합니다.
에코 사용에 대한 사이드바
스크립트에서 변수를 구문 분석하고 실수로 이를 사용하여 echo
메시지를 인쇄하는 경우 관심 있는 문자열보다 더 많은 것을 얻는 경우가 많습니다. echo
후행 개행 문자도 포함됩니다. 이 예에서 확인할 수 있습니다.
$ echo $(echo hi) | hexdump -C
00000000 68 69 0a |hi.|
00000003
0a
개행 문자의 ASCII 코드 입니다 . 따라서 -n
이 동작을 비활성화하려면 일반적으로 다음 스위치를 사용해야 합니다 echo
.
$ echo -n $(echo hi) | hexdump -C
00000000 68 69 |hi|
00000002
또는 printf
.