큰 소리를 내는 방법!

큰 소리를 내는 방법!

echo에디터로 열지 않고 파일에 내용을 넣어서 스크립트를 만들어 보았습니다.

echo -e "#!/bin/bash \n /usr/bin/command args"  > .scripts/command

이것산출:

bash: !/bin/bash: 이벤트를 찾을 수 없습니다

나는 이 이상한 행동을 다음과 비교했습니다..

$ echo !
!  

$ echo "!"
bash: !: event not found

$ echo \#!
#!

$ echo \#!/bin/bash
bash: !/bin/bash: event not found
  • 폭발이 왜 발생합니까?
  • bash가 말하는 "이벤트"는 무엇입니까?
  • 이 문제를 어떻게 해결하고 "#!/bin/bash"를 화면이나 내 파일에 인쇄합니까?

답변1

작은따옴표를 사용해 보세요.

echo -e '#!/bin/bash \n /usr/bin/command args'  > .scripts/command

echo '#!'

echo '#!/bin/bash'

이 문제는 bash가 기록에서 !/bin/bash를 검색하기 때문에 발생합니다. 이 동작을 방지하려면 작은따옴표를 사용하십시오.

답변2

~처럼리치 라고, bash가 다음을 수행하려고 합니다.역사적 경기. 이를 피하는 또 다른 방법은 다음 명령을 사용하여 폭발을 피하는 것입니다 \.

$ echo \#\!/bin/bash
#!/bin/bash

큰따옴표는 \제거되지 않습니다.

$ echo "\!"
\!

답변3

!기록 교체를 시작합니다("이벤트"는 명령 기록의 한 줄입니다). 예를 들어 포함된 마지막 명령줄로 확장 !ls됩니다 . 또한 특정 단어(예: 이전 명령을 참조하는 첫 번째 단어)를 추출할 수도 있습니다. 자세한 내용은 설명서를 참조하세요.ls!?foofoo!!:1

이 기능은 명령줄 버전이 아직 원시적이었을 때 이전 명령을 빠르게 호출하기 위해 고안되었습니다. 최신 쉘(적어도 bash 및 zsh)과 복사-붙여넣기를 사용하면 히스토리 확장이 예전만큼 유용하지 않습니다. 여전히 유용하지만 그것 없이도 지낼 수 있습니다.

변수를 설정하여 기록 교체를 실행하는 역할을 변경할 수 있습니다 . 기록 교체를 거의 사용하지 않는 경우 대신 기록 확장이 실행되도록 histchars설정할 수도 있습니다 .histchars='¡^'¡!set +o histexpand

답변4

다음 예에서는 제안된 솔루션이 작동하지 않습니다.

$ bash -c "echo 'hello World!'"
-bash: !'": event not found
$

이 경우 8진수 ASCII 코드를 사용하여 bang을 인쇄할 수 있습니다.

$ bash -c "echo -e 'hello World\0041'"
hello World!
$

관련 정보