질문 : 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
'개발관련 > other' 카테고리의 다른 글
APK 파일의 리버스 엔지니어링을 피하는 방법 (0) | 2021.11.03 |
---|---|
Visual Studio의 출력 창에 메세지 쓰기 (0) | 2021.11.02 |
.NET에서 C # 개체를 JSON 문자열로 바꾸는 방법 (0) | 2021.11.01 |
두개의 list를 병렬로 반복하는 방법 (0) | 2021.11.01 |
Inversion of Control 에 대해서 (0) | 2021.10.25 |