개발관련/other

IF 문을 사용할 때 sheel 명령을 여러 줄로 분할하는 방법

Rateye 2021. 11. 1. 10:31
728x90
반응형
질문 : IF 문을 사용할 때 쉘 명령을 여러 줄로 분할하려면 어떻게해야합니까?

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에 대한 이해에서 빠진 것이 무엇이고 앞으로이 문제와 유사한 문제를 이해하는 데 도움이 될까요?

답변

백 슬래시 뒤와 개행 앞에 공백 (공백 또는 탭 문자 1 )이 있으면 행 연속이 실패합니다. 그러한 공백이 없으면 귀하의 예제가 잘 작동합니다.

$ 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

주석에서 몇 가지 세부 사항을 홍보했습니다. 쉘의 줄 연속 백 슬래시는 실제로 특별한 경우가 아닙니다. 백 슬래시가 바로 뒤에 오는 문자를 "인용"하여 일반적으로 적용되는 특수 처리를 방지하는 일반적인 규칙의 한 예입니다. 이 경우 다음 문자는 개행 문자이며 방지되는 특수 처리는 명령을 종료하는 것입니다. 일반적으로 따옴표로 묶인 문자는 말 그대로 명령에 포함됩니다. 백 슬래시 줄 바꿈은 대신 완전히 삭제됩니다. 그러나 그렇지 않으면 메커니즘이 동일합니다. 가장 중요한 것은 백 슬래시는 바로 뒤에 오는 문자 만 인용한다는 것입니다. 해당 문자가 공백 또는 탭이면 리터럴 공백 또는 탭을 얻습니다 (백 슬래시가 공백이 다른 인수를 구분하는 따옴표없는 공백으로 축소되는 것을 방지하기 때문에 별도의 인수가됩니다). 백 슬래시는 다음 줄 바꿈에 영향을주지 않습니다.

그 문제에 대해 Czechnology가 지적한대로 1 또는 캐리지 리턴. Bash는 WSL에서도 Windows 형식의 텍스트 파일과 어울리지 않습니다. 또는 Cygwin이지만 적어도 Bash 포트에는 캐리지 리턴 허용하도록 설정할 수 set -o igncr

출처 : https://stackoverflow.com/questions/18599711/how-can-i-split-a-shell-command-over-multiple-lines-when-using-an-if-statement
728x90
반응형