Bourne 쉘 스크립트(읽기: Bash 확장을 사용할 수 없음)에서 실행하려고 하는데 rsync
많은 검색, 작은따옴표/큰따옴표 조합, 이스케이프 등을 수행한 후에 인수가 올바르게 전달될 수 없습니다 --out-format='%n'
.
예를 들어 다음 스크립트는 다음과 같습니다.
#!/bin/sh
(set -x ; $(rsync -auh --delete --out-format='%n' "$1" "$2")) || exit 1
MacOS 10.12.6에서 호출하면 ./myscript.sh dir1/ dir2/
다음 출력이 반환됩니다.
++ rsync -auh --delete --out-format=%n dir1/ dir2/
+ ./ file1.c file1.h file2.c file2.h
myscript.sh: line 3: ./: is a directory
중화 내용 file1.c
file1.h
file2.c
은file2.h
dir1/
+ ./ file1.c file1.h file2.c file2.h
우선, 해당 줄이 출력되는 이유를 모르겠습니다. 왜냐하면 --out-format='%n'
같은 줄에 있는 모든 파일이 아니라 한 줄에 하나의 파일을 출력하기 때문입니다. 게다가 그 의문의 시작이 ./
오류의 원인(또는 결과)인 것 같습니다.
--out-format='%n'
이것을 스크립트에서 제거 하면 오류 없이 잘 실행됩니다.
--out-format='%n'
터미널에서 명령을 실행하면 인수에 작은따옴표( 및 ) 가 있든 없든 --out-format=%n
잘 실행됩니다 . 스크립트에서는 두 경우 모두 실패합니다.
이 오류의 원인은 무엇입니까?
답변1
rsync
명령 대체에서 명령을 실행하고 있습니다 . 명령 대체는 그 안에 있는 명령의 출력으로 대체되며 스크립트 작성 방법에 따라 이 출력은 명령으로 실행되므로 해당 오류 메시지와 이상하게 보이는 추적 출력이 표시됩니다.
대신에:
#!/bin/sh -x
rsync -auh --delete --out-format='%n' "$1" "$2" || exit 1
set -x
스크립트 내의 하위 쉘에서 계속 사용하려면 다음 을 수행하십시오.
#!/bin/sh
( set -x; rsync -auh --delete --out-format='%n' "$1" "$2" ) || exit 1
스크립트의 마지막 명령인 경우 exit 1
제거할 수 있습니다 . rsync
강제로 실행하지 않는 한 스크립트의 종료 상태는 실행된 마지막 명령의 상태가 되기 때문입니다.정확히1. 아무리 rsync
실패해도.