저는 Unix 쉘 스크립트를 작성해 왔지만 올바른 형식에 대한 경험이 없습니다. 단일 명령을 실행하기 위해 긴 줄을 작성해야 하는 상황이 많이 있습니다.
문제는 하나의 긴 쉘 명령 줄을 여러 줄로 분할하지만 단일 명령으로 실행되도록 하는 방법이 있습니까?
답변1
단일 간단한 명령의 긴 줄은 다음과 같이 개행 문자를 이스케이프 처리하여 분할할 수 있습니다.
rsync --archive --itemize-changes \
"$source" \
"$target"
백슬래시는 해당 줄의 마지막 문자여야 합니다.
POSIX 표준의 관련 비트:
2.2.1 이스케이프 문자(백슬래시)
따옴표가 없는 A는
<backslash>
a를 제외한 후속 문자의 리터럴 값을 유지해야 합니다<newline>
. 가<newline>
뒤에 오면<backslash>
쉘은 이를 줄 연속으로 해석합니다. 입력을 토큰으로<backslash>
분할하기 전에 제거해야 합니다.<newline>
이스케이프 문자는<newline>
입력에서 완전히 제거되고 공백으로 대체되지 않으므로 토큰 구분 기호로 사용할 수 없습니다.
파이프 또는 및/또는 목록 등과 같은 단일 복합 명령 내에는 이스케이프할 필요가 없는 개행 문자에 대한 자연스러운 지점이 있는 경우가 많습니다( 및 &&
는 명령 종결자이므로).||
|
[ -e "$pathname" ] &&
printf 'Removing %s\n' "$pathname" &&
rm -- "$pathname"
awk -f script.awk <infile |
grep -e "$pattern" |
cat header.txt - >result.txt
답변2
긴 문자열을 더 작고 읽기 쉬운 구성 요소로 나누거나 후행 "\"를 사용하여 줄 바꿈을 나타냅니다.
"남자 난교"에서:
\<newline>
쌍이 발생하고 백슬래시 자체가 따옴표로 묶이지 않으면 줄\<newline>
연속으로 처리됩니다(즉, 입력 스트림에서 제거되어 사실상 무시됩니다).