명령에서 printf "#!/bin/bash\n" > t
오류( bash: !/bin/bash\n": event not found
)가 발생하지만 위쪽 키를 눌러도 명령이 호출되지 않아 수정할 수 없습니다. 왜 그런 겁니까?
printf "%s\n" '#!/bin/bash' >t
(내가 여기서 시도하는 것은 Bash를 배우려고 노력하고 bash 기록이 이전 명령을 캡처하지 못하는 이유를 정말로 이해하고 싶어함으로써 달성될 수 있습니다 printf
.)
답변1
당신이 발견한 대로, 이 !
캐릭터는 역사 확장을 유발합니다. 이 단계는 확장이 완료된 경우 명령이 기록에 저장될 수 있도록 명령이 기록에 저장되기 전에 발생합니다. 히스토리 확장 시 오류가 발생하면 bash는 명령 처리를 중지하므로 히스토리에 저장되지 않습니다.
기록 확장을 사용하면 이전 명령이나 이전 명령의 일부를 현재 명령으로 바꿀 수 있습니다. 명령을 히스토리에 저장하기 전에 이 작업을 수행하면 이전 명령이 인스턴스마다 다르기 때문에 실행될 때마다 다른 의미를 가질 수 있습니다. 바라보다http://www.gnu.org/software/bash/manual/bashref.html#History-Interaction
참고로 zsh
동작이 다릅니다. 명령을 저장하지만 기록 확장이 부족합니다.
답변2
bash: !": event not found
이는 대화형 셸의 경우 기본적으로 Bash가 느낌표를 사용하여 csh 스타일 기록 확장을 수행하기 때문입니다. 이는 쉘 스크립트에서는 문제가 되지 않습니다. 대화형 쉘에서만 가능합니다.
가장 간단한 해결책은 histexpand 옵션을 설정 해제하는 것입니다. 이는 set +H
또는 를 사용하여 수행 할 수 있습니다 set +o histexpand
.
이에 대해 더 자세히 읽을 수 있습니다.Bash Pitfalls 웹사이트에서.