![큰 소리를 내는 방법!](https://linux55.com/image/41883/%ED%81%B0%20%EC%86%8C%EB%A6%AC%EB%A5%BC%20%EB%82%B4%EB%8A%94%20%EB%B0%A9%EB%B2%95!.png)
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
답변3
!
기록 교체를 시작합니다("이벤트"는 명령 기록의 한 줄입니다). 예를 들어 포함된 마지막 명령줄로 확장 !ls
됩니다 . 또한 특정 단어(예: 이전 명령을 참조하는 첫 번째 단어)를 추출할 수도 있습니다. 자세한 내용은 설명서를 참조하세요.ls
!?foo
foo
!!: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!
$