의 의미는 무엇입니까! 쉘의 명령 전에?
질문은 제목에 있습니다. 느낌표로 시작하는 쉘 명령 (쉘 스크립트의 일부)의 목적은 무엇입니까? 구체적인 예 :
foo.sh에서 :
#!/usr/bin/env bash
set -e
! docker stop foo
! docker rm -f foo
# ... other stuff
공백이 없으면 느낌표가 히스토리 교체 ! <expression>
에 사용되며 man 페이지 에 따르면 " expr이 false 인 경우 True "를 평가하는 데 사용할 수 있습니다 . 그러나 나에게 의미가없는 예제 컨텍스트에서.
TL; DR : 이것은 set -e
당신이 사용하고있는 특정 라인 의 플래그를 우회하는 것입니다.
hek2mgl의 정확하고 유용한 답변에 추가를 추가하십시오 .
당신은 :
set -e
! command
Bash 참조 매뉴얼 → 파이프 라인 은 다음을 설명합니다.
파이프 라인의 각 명령은 자체 서브 쉘에서 실행됩니다. 파이프 라인의 종료 상태는 파이프 라인의 마지막 명령 (...)의 종료 상태입니다. 예약어 '!' 파이프 라인 앞에있는 경우 종료 상태는 위에서 설명한 종료 상태의 논리적 부정입니다 . 셸은 값을 반환하기 전에 파이프 라인의 모든 명령이 종료 될 때까지 기다립니다.
이것은 !
이전 명령이 종료 상태를 무효화 한다는 것을 의미 합니다.
$ echo 23
23
$ echo $?
0
# But
$ ! echo 23
23
$ echo $?
1
또는:
$ echo 23 && echo "true" || echo "fail"
23
true
$ ! echo 23 && echo "true" || echo "fail"
23
fail
종료 상태는 여러면에서 유용합니다. 스크립트에서와 함께 사용 set -e
하면 명령이 0이 아닌 상태를 반환 할 때마다 스크립트가 종료됩니다.
따라서 다음과 같은 경우 :
set -e
command1
command2
경우 command1
비 제로 상태 반환 스크립트가 완료되고으로 진행되지 않습니다 command2
.
그러나 4.3.1 The Set Builtin에 설명 된 흥미로운 점이 있습니다 .
-이자형
단일 명령 (단순 명령 참조), 목록 (목록 참조) 또는 복합 명령 (복합 명령 참조)으로 구성 될 수있는 파이프 라인 (파이프 라인 참조)이 0이 아닌 상태를 반환하면 즉시 종료합니다. 실패한 명령이 while 또는 until 키워드 바로 뒤에 오는 명령 목록의 일부, if 문에서 테스트의 일부, && 또는 ||에서 실행되는 명령의 일부인 경우 쉘은 종료되지 않습니다 . 마지막 && 또는 || 다음에 오는 명령을 제외한 목록, 파이프 라인의 모든 명령이지만 마지막 명령 이거나 명령의 반환 상태가!로 반전되는 경우 . -e가 무시되는 동안 명령이 실패하여 서브 쉘 이외의 복합 명령이 0이 아닌 상태를 리턴하면 쉘이 종료되지 않습니다. ERR에 대한 트랩이 설정된 경우 쉘이 종료되기 전에 실행됩니다.
Taking all of these into consideration, when you have:
set -e
! command1
command2
What you are doing is to by-pass the set -e
flag in the command1
. Why?
- if
command1
runs properly, it will return a zero status.!
will negate it, butset -e
won't trigger an exit by the because it comes from a return status inverted with !, as described above. - if
command1
fails, it will return a non-zero status.!
will negate it, so the line will end up returning a zero status and the script will continue normally.
If you don't want the script to fail in both cases, error or success of the command, you can also use this alternative:
set -e
docker stop foo || true
The boolean or true makes the pipeline always have 0
as the return value.
"!" Means "not", so when you place it before a command and you run "$?" It will echo a 1. Which means it failed instead of a 0, which means success.
참고URL : https://stackoverflow.com/questions/47261313/whats-the-meaning-of-a-before-a-command-in-the-shell
'developer tip' 카테고리의 다른 글
: after 요소가 다음 줄로 줄 바꿈되지 않도록 방지 (0) | 2020.10.27 |
---|---|
단어 목록으로 grep하는 방법 (0) | 2020.10.27 |
자바 로그 뷰어 (0) | 2020.10.27 |
그래프에서주기를 찾는 데 BFS가 아닌 DFS가 필요한 이유 (0) | 2020.10.27 |
이동 된 파일의 GIT 이력보기 (0) | 2020.10.27 |