터미널/배쉬의 에코 기호

터미널/배쉬의 에코 기호

터미널에 메시지를 표시하려고 할 때 "!"를 사용할 수 없는 이유는 무엇입니까? 예를 들어:

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.

관련 정보