Bash에서 느낌표 하나를 입력하면 무엇을합니까?


20

Bash는 이 질문 에 대한 답변에서 설명한대로 내역 확장에 느낌표를 사용합니다 (예 :로 sudo !!이전 명령 줄을 실행 sudo). 그러나 다음 명령 (즉, 하나의 느낌표)을 실행하는 것이 무엇인지 설명하는 곳을 찾을 수 없습니다.

!

아무것도 인쇄하지 않고 1로 종료되는 것처럼 보이지만 왜 그렇게하는지 잘 모르겠습니다. 온라인과 Bash 매뉴얼 페이지를 보았지만 "예약 된 단어"라는 사실 외에는 아무것도 찾을 수 없지만 다음 }과 같이 실행하면됩니다.

}

오류를 인쇄합니다.

bash: syntax error near unexpected token `}'

1
아무것도. !히스토리 확장 표현식의 "시작"을 나타냅니다.
jordanm

답변:


47

!명령 시작시 고독 은 명령 또는 파이프 라인의 종료 상태를 무효화합니다 . 명령이 종료 0되면 명령이 1실패 (실패)하고 0이 아닌 값을 종료하면 0성공 (종료) 종료 로 바뀝니다 .

이 사용법은 Bash 매뉴얼에 설명되어 있습니다.

예약어 '!' 파이프 라인 앞에 나오면 종료 상태는 위에서 설명한 종료 상태의 논리적 부정입니다.

!없이 다음 명령은 아무것도 true를 돌려줍니다 (에 해당하지 않습니다 빈 명령, 부정 명령 ). 따라서 true를 false로 반전시키고 상태 1로 종료되지만 오류는 발생하지 않습니다.:


조건부 테스트를 무효화하는 and 및 명령 !내에서 다른 용도도 있습니다 . 이것들은 당신이보고있는 것과 관련이 없습니다. 귀하의 질문과 그 경우 모두 역사 확장과 관련이 없으며 다른 용어 와 분리되어 있습니다.test[[!


5
실제로 실행되는 내용 과 리턴 코드를 설명하는 이유를 설명 하는 첫 번째 답변에 +1
Jeff Schaller

11

bash 매뉴얼 섹션 3.2.2 파이프 라인에 설명 된 단일 느낌표를 찾을 수 있습니다.

예약어 '!' 파이프 라인 앞에 나오면 종료 상태는 위에서 설명한 종료 상태의 논리적 부정입니다.

$ ! true; echo $?
1
$ ! false; echo $?
0

섹션 3.2.4.2 조건부 구성

! 표현

식이 거짓이면 참입니다.


섹션 4.1 Bourne Shell Builtins

! expr

expr이 false이면 true입니다.


또한 !스페이스, 탭, 줄 끝, '='또는 '('(쇼핑몰 내장 옵션을 사용하여 extglob 셸 옵션을 활성화 한 경우)이 아니라면 히스토리 대체를 시작 해야합니다 .


0

!비교에 사용 되므로 NOT을 의미 합니다.

예를 들면 다음과 같습니다.

a=3
b=2

[ $a -eq $b ] && echo "Equal"
[ ! $a -eq $b ] && echo "Not equal"
# of cause last comparison is possible to write as:
[ $a -eq $b ] || echo "Not equal"

[ $a -eq $b ]
echo $?
1
[ ! $a -eq $b ]
echo $?
0

1
이것이 명령 위치에 사용될 때 의 의미가 아니라 명령에 !대한 인수로서의 의미입니다 test(bash의 내장 버전 포함) !.
Gilles 'SO- 악마 중지'

1
! [...]이 경우 질문과 일치 해야합니다 .
Michael Homer

@Gilles 및 @Michael Homer와 동의합니다. 나는 알고 []있다 test. 나는 조금 서두르고 있습니다.
Yurij Goncharuk

-2

! 내장 명령으로 파이프 라인의 의미를 반전시킵니다.

다른 용도 :

#! 내장 명령, 명명 된 인터프리터를 호출하여 스크립트를 실행합니다.

! 이벤트 지정자, 명령 행 단어를 히스토리 대체로 표시

!= 불평등 연산자

$! 쉘 변수, 마지막 백그라운드 명령의 프로세스 번호를 반환합니다.


추가하기 위해! $를 사용하여 이전 명령의 마지막 단어를 다음과 같이 사용할 수 있습니다. ls -l /tmp cd !$ 그러면 / tmp 디렉토리로 이동합니다.
호핑 토끼

-3

! 그 뒤에 문자열이 오는 것은 주어진 문자열로 시작한 가장 최근의 이전 명령 (여전히 명령 버퍼에 있음)을 실행합니다. 아마도 쉘 은 <null>로 시작한 이전 명령 이 없다는 것을 알았습니다 .


3
질문에 주어진 문자열 이 없다는 것을 알았습니다 ...?
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.