IF 문을 사용할 때 쉘 명령을 여러 줄로 나누려면 어떻게해야합니까?


384

명령이 if명령문의 일부일 때 쉘에서 여러 행으로 명령을 분할하려면 어떻게 해야합니까?

이것은 작동합니다 :

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                                                                       
fi

작동하지 않습니다.

# does not work:
if ! fab --fabfile=.deploy/fabfile.py \ 
  --forward-agent \
  --disable-known-hosts deploy:$target; then   
  rc=1
fi

전체 명령을 실행하는 대신 다음을 얻습니다.

./script.sh: line 73: --forward-agent: command not found

더 중요한 것은, Bash에 대한 나의 이해에서 누락되어 향후에 이와 비슷한 문제를 이해하는 데 도움이되는 것은 무엇입니까?


2
오류가 무엇입니까? $ if ! cp -n log/server1.log \ > .; then echo no copy; fi다음 줄 바꿈으로 오류없이 실행할 수 있습니다.\
Miserable Variable

15
터미널 백 슬래시 뒤에 공백이 \ 있습니까? 그들은보기가 매우 어렵습니다. 그렇다면 편집자가 후행 공백을 제거하거나 더 잘 보이게 만들 수 있는지 확인하고 싶을 것입니다.
msw

10
예, 터미널 백 슬래시 뒤에 공백이 있습니다. 전적으로. 감사합니다.
Dmitry Minkovsky

그리고 네, 죄송합니다, "오류"(예기치 않은 결과)를 게시했을 것입니다! 내 잘못이야! 지금 수정 중입니다.
Dmitry Minkovsky

당신의 이해는 무엇입니까? 그것은 질문의 일부도 아닙니다.
hakre

답변:


566

백 슬래시 다음과 줄 바꾸기 전에 공백 (공백 또는 탭 문자)이 있으면 줄 연속이 실패합니다. 그러한 공백이 없으면 예제가 잘 작동합니다.

$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
   --forward-agent \
   --disable-known-hosts deploy:$target; then
     echo failed
else
     echo succeeded
fi

$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed

주석에서 일부 세부 사항이 승격되었습니다. 쉘의 행 연속 백 슬래시는 실제로 특별한 경우가 아닙니다. 백 슬래시는 바로 뒤 따르는 문자를 "인용"하여 일반적으로 적용되는 특수한 처리를 방지하는 일반적인 규칙의 예입니다. 이 경우 다음 문자는 개행 문자이며 특수 처리가 금지되어 명령이 종료됩니다. 일반적으로 인용 된 문자는 명령에 문자 그대로 포함됩니다. 백 슬래시 줄 바꿈은 대신 완전히 삭제됩니다. 그러나 그렇지 않으면 메커니즘은 동일합니다. 백 슬래시는 바로 뒤 따르는 문자 만 인용합니다. 해당 문자가 공백 또는 탭인 경우 인용 된 공백 또는 탭을 가져 오며 후속 줄 바꿈은 인용되지 않은 상태로 유지됩니다.


5
마크, 당신은 알다시피, 공백이 있어야합니다. `s. For example, when adding one after the first ` 다음에 공백을 추가 할 때만 오류를 재현 할 수 ./soundops: line 73: --forward-agent: command not found있습니다. 내 문제는이 오류를 이해하지 못했다는 것입니다. 공백이 생기면 왜 그 에러가 발생합니까? 공백 + \n는``을 무시하고 ''명령을 구분합니까?
Dmitry Minkovsky

83
줄 바꿈 앞의 백 슬래시는 줄 바꿈이 명령을 종료하지 못하게합니다. 그러나 "\ n"과 같은 특수 이스케이프 시퀀스는 백 슬래시와 n 사이에 아무 것도 작동하지 않는 것처럼, 백 슬래시-개행은 백 슬래시와 개행 사이에 아무 것도 작동하지 않습니다.
마크 리드

18
물론 하하하. 그런 식으로 본 적이 없습니다. 눈길을 끄는, 너무 간단합니다. 이스케이프 된 줄 바꿈 일뿐입니다. 나는 보이지 않는 캐릭터가 싫어. 그들이 모두 눈에 보이는 경우 그들은 훨씬 더 이해가 될 것입니다. 감사합니다!
Dmitry Minkovsky

7
대부분의 편집기에서 보이지 않는 문자를 볼 수 있습니다.
lucasvc

1
백 슬래시와 개행은 유효 명령 행에서 삭제되지만 다음 행의 선행 공백은 유지됩니다. 따라서 문제인지 여부는 단일 행 명령의 해당 시점에서 공백이 문제인지 여부에 따라 다릅니다.
Mark Reed

52

Windows / WSL / Cygwin 등 사용자의 경우 :

줄 끝이 표준 Unix 줄 바꿈인지 확인하십시오 \n( 예 : (LF)).

\r\nCRLF ( Windows 줄 끝 ) 줄 끝을 사용하면 명령 줄이 끊어집니다.


그 이유는 \ 윈도우 라인으로 변환을 끝나는 줄 끝에 \ \r \n.
마크가 위에서 올바르게 설명했듯이 :

백 슬래시 다음과 줄 바꿈 앞에 공백이 있으면 줄 연속이 실패합니다.

여기에는 공백 ( ) 또는 탭 ( \t)뿐만 아니라 캐리지 리턴 ( \r)도 포함됩니다.


1
이 기능은 Windows에서 스크립트를 생성 한 다음 Windows bash에서 사용할 때 생성 된 문제를 해결합니다 (예 : Windows 편집기에서 MyShellScript.sh가 생성 된 bash -c MyShellScript.sh). 메모장 ++를 사용하여 MyShellScript.sh를 UNIX 형식으로 저장해야합니다.
BSalita
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.