Bash는 다음 질문에 대한 답변에 설명된 대로 기록 확장을 위해 느낌표를 사용합니다.이 문제(예: sudo !!
이전 명령줄 실행 사용 sudo
) 그러나 다음 명령(예: 단일 느낌표)을 실행하는 작업을 설명하는 곳을 찾을 수 없습니다.
!
아무 것도 인쇄하지 않고 1로 종료되는 것 같지만 왜 이렇게 되는지는 잘 모르겠습니다. 온라인과 Bash 매뉴얼 페이지를 보았지만 "예약어"라는 사실 외에는 아무것도 찾을 수 없었습니다. 그러나 }
다음 명령을 실행했습니다.
}
인쇄 오류:
bash: syntax error near unexpected token `}'
답변1
외톨이!
명령 시작 시 명령 또는 파이프의 종료 상태를 무효화합니다.: 명령이 종료되면 (실패) 0
로 전환되고 , 0이 아닌 값으로 종료되면 (성공) 종료 1
로 전환됩니다 .0
이 사용법은 Bash 매뉴얼에 문서화되어 있습니다.
예약어 '!'가 파이프 앞에 오면 종료 상태는 위의 종료 상태에 대한 논리적 부정입니다.
후속 명령이 없는 A는 !
아무 작업도 수행하지 않고 true를 반환하는 빈 명령을 무효화합니다(:
명령). 따라서 true를 false로 반전하고 상태 1로 종료되지만 오류가 발생하지 않습니다.
!
안에는 다른 용도도 있어요test
그리고[[
조건부 테스트를 무효화하는 명령. 이것들은 당신이 보고 있는 것과 아무 관련이 없습니다. 귀하의 질문과 이러한 경우에는 역사적 확장과 관련이 없으며 !
다른 용어와 별개입니다.
답변2
bash 매뉴얼 섹션에서 문서화된 단일 느낌표를 찾을 수 있습니다.3.2.2 파이프라인
예약어 '!'가 파이프 앞에 오면 종료 상태는 위의 종료 상태에 대한 논리적 부정입니다.
$ ! true; echo $?
1
$ ! false; echo $?
0
축제로 돌아가기3.2.4.2 조건부 구성
! 표현하다
표현식이 거짓이면 참입니다.
축제로 돌아가기4.1 Bourne Shell 내장 기능
! 표현
expr이 거짓이면 참입니다.
!
공백, 탭, 줄 끝, "=" 또는 "("(내장 shopt를 사용하여 extglob 쉘 옵션이 활성화된 경우)이 뒤따르지 않는 한 기록 교체가 시작된다는 점도 주의해야 합니다 .
답변3
!
비교와 수단으로 사용되기 때문에아니요.
예를 들어:
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
답변4
! 문자열 뒤에는 주어진 문자열로 시작하는 가장 최근 명령(여전히 명령 버퍼에 있음)을 실행합니다. 아마도 껍질이 방금 발견되었을 수도 있습니다.아니요이전 명령은 <null>로 시작되었습니다.