개행을 이스케이프하면 코드가 제대로 작동하지 않게 됩니다. 왜?

개행을 이스케이프하면 코드가 제대로 작동하지 않게 됩니다. 왜?

Google의 마크다운 스타일 가이드:

대부분의 명령줄 조각은 터미널에 직접 복사하여 붙여넣기 위한 것이므로 줄 바꿈을 이스케이프 처리하는 것이 가장 좋습니다. 줄 끝에 단일 백슬래시를 사용합니다.

bazel run :target -- --flag --foo=longlonglonglonglongvalue \
--bar=anotherlonglonglonglonglonglonglonglonglonglongvalue

다음 코드 조각을 터미널에 복사하여 붙여넣으면 줄바꿈을 이스케이프 처리하면 작동 오류가 발생하는 이유를 누군가 설명할 수 있습니까? (저는 Mac에서 zsh를 사용하고 있는데 순수 Bash 및/또는 다른 터미널에서도 동일한 일이 발생하는지 확실하지 않습니다. 질문. ?):

이 코드 조각을 복사하여 터미널에 붙여 넣으면 정상적으로 작동합니다.

for (( counter=10; counter>0; counter-- ))
do
echo -n "$counter "
done
printf "\n"

하지만 이것을 복사해서 붙여넣으면 오류가 발생합니다.

for (( counter=10; counter>0; counter-- )) \
do \
echo -n "$counter " \
done \
printf "\n"

답변1

개행 문자( NL, ^J)는 줄의 끝을 표시하며 일반적으로 명령을 끝냅니다.

이스케이프된 NL 문자는 공백으로 처리되며 명령이나 줄을 끝내지 않습니다.

foo
bar

두 가지 명령입니다.

foo \
bar

명령이다,

foo bar

답변2

\그 뒤에 개행 문자가 옵니다.계속하다가독성을 높이기 위해 매우 긴 줄을 여러 줄로 나누는 데 자주 사용됩니다.

쉘은 해당 내용을 읽은 후 삭제합니다.

ec\
ho t\
est

그것을 작성하는 또 다른 방법:

echo test

그리고:

for (( counter=10; counter>0; counter-- )) \
do \
echo -n "$counter " \
done \
printf "\n"

그것을 작성하는 또 다른 방법이 있습니다:

for (( counter=10; counter>0; counter-- )) do echo -n "$counter " done printf "\n"

루프를 닫는 루프가 누락된 것을 echo -n "$counter " done printf "\n"제외하고는 루프에서 실행됩니다 (다른 하나 는 매개변수임 ).donedoneecho

\<newline>따라서 매우 긴 줄을 나누기 위해 일부를 삽입하고 싶을 수도 있지만아니요다음과 동일한 <newline>s(명령 등을 구분하는 데 사용됨)를 교체하고 싶습니다 .\<newline>아무것도 없다1.


¹ 작은 따옴표 내(또는 $'...'작은 따옴표를 지원하는 쉘의 경우) 또는 여기에 설명된 대로 따옴표 구분 기호( << "EOF"...EOF예:

답변3

;쉘 구문에는 명령을 구분하는 세미콜론( ) 표시가 있습니다 .

대안으로 개행 문자를 사용할 수 있습니다. 즉, 다음과 같이 할 수 있습니다.

command ; command

아니면 이거:

command
command

셸의 일부 구문 구조는 루프와 같은 여러 명령으로 구성됩니다.

while test-command1; test-comand2 ; do command1; command2; command3; done

구문상으로 이것은 6개의 명령입니다. while루프를 제어하는 ​​테스트 명령 시퀀스의 시작을 표시하는 명령입니다. 그런 다음 do루프 본문의 시작을 표시하는 명령이 옵니다 . done끝을 알리는 마지막 명령입니다.

여러 줄에 걸쳐 쓸 때 세미콜론은 선택 사항이 됩니다.

while test-command-1
      test-command-2
do    command1
      command2
      command3
done

이제 백슬래시 개행 시퀀스(종종 줄 연속이라고 함)는 여러 물리적 줄을 단일 논리적 줄로 변환합니다. Awk 언어, Make 언어, C 언어의 전처리 기능에도 비슷한 줄 연속 기능이 있습니다.

쉘 스크립트를 연속된 줄이 있는 여러 개의 물리적 줄로 나누면 인터프리터는 한 줄만 봅니다. 따라서 세미콜론이 필요합니다.

잘못된:

while test-command-1 \
      test-command-2 \
do    command1 \
      command2 \
      command3 \
done

옳은:

while test-command-1 ; \
      test-command-2 ; \
do    command1 ; \
      command2 ; \
      command3 ; \
done

에서 이런 일이 발생하는 것을 흔히 볼 수 있습니다 Makefile. Make에서 빌드 레시피의 각 줄은 별도의 셸 인스턴스에서 실행되는 별도의 셸 스크립트입니다. 따라서 각 스크립트는 make 구문의 단일 논리적 행에 맞아야 합니다. 줄 연속은 복잡한 쉘 스크립트를 여러 개의 물리적 줄로 나누는 데 사용되므로 세미콜론이 필요합니다.

관련 정보