터미널에 메시지를 표시하려고 할 때 "!"를 사용할 수 없는 이유는 무엇입니까? 예를 들어:
echo -e "Hello\nWorld!"
bash는 다음 명령을 반환합니다.
bash !: event not found
답변1
이 !
문자를 "뱅"이라고 하며 bash
명령 기록을 불러오는 데 사용됩니다. 다음 네 가지 방법으로 사용할 수 있습니다.
!<firstFewCharsOfPreviousCommand>
예:
!rm
그러면 "rm"으로 시작하여 실행한 마지막 명령으로 이동하여 전체 명령이 실행됩니다. 예주의 깊은rm과 같이 잠재적으로 파괴적인 명령을 반복하면 의도하지 않은 다른 명령을 실수로 실행할 수도 있습니다. 위의 내용은 bash의 CTRL-R
역방향 검색 기능을 사용하는 것이 더 안전한 선택임을 보여줍니다.
!<indexInCommandHistory>
예:
!433
색인은 명령을 실행할 때 명령 옆에 나타나는 숫자입니다 history
.
!!
그게 전부이기 때문에 예가 필요하지 않습니다. 이전 명령을 다시 실행합니다(대부분의 Linux 배포판에서 위쪽 화살표와 동일).
!$
예:
# ls -lh /etc/fstab
# vi !$
또 다른 리터럴은 bash가 실행할 때 !$
마지막 단어(공백 없는 문자열)로 대체됩니다.
마지막 명령에서 본 것처럼 더 크거나 다른 명령의 일부로 사용할 수도 있습니다. 다른 예시 !!
:
[root@hypervisor libsceptre]# echo hey
hey
[root@hypervisor libsceptre]# echo !!
echo echo hey <-- printed to stderr so you know what !! was expanded to
echo hey
[root@hypervisor libsceptre]#
bash가 문자를 해석하는 대신 어떤 이유로든 문자를 리터럴로 처리하도록 하려면 텍스트를 작은따옴표로 묶을 수 있습니다.
[root@hypervisor libsceptre]# echo -e "Hello\nWorld!"
-bash: !": event not found
[root@hypervisor libsceptre]# echo -e 'Hello\nWorld!'
Hello
World!
[root@hypervisor libsceptre]#
명령이 작동하지 않는 이유는 큰따옴표로 시작하는 마지막 명령(첫 번째 예에서 설명한 기능)을 찾으려고 하는데 찾을 수 없기 때문입니다.
답변2
히스토리 확장을 사용하지 않는 경우(분명히 사용하지 않는 경우) 이상한 인용 및 억제 규칙을 배우기보다는 이를 비활성화해야 합니다.
set +H
아니면 set +o histexpand
그것에서 벗어나십시오. echo $-
("H"는 활성을 의미함) 또는 ( )를 통해 set -o
활성 상태인지 확인할 수 있습니다 histexpand
.
답변3
폭발을 피해야 합니다:
echo -e "Hello\nWorld"\!
노트:따옴표 바깥쪽에 폭발을 포함시킨 것은 의도적인 것입니다. 그렇지 않으면 \!
에코입니다.
답변4
큰따옴표 안의 특별한 의미는 !
여전히 유효합니다. !
예를 들어 정수 n을 인수로 사용하고 쉘 기록에서 n번째 명령을 실행하는 쉘 키워드입니다. 혼동을 피하기 위해 작은따옴표나 이스케이프 문자를 사용하세요.
에서 히스토리 명령 확장에 대한 자세한 내용을 읽을 수 있습니다 man history
.