나는 다음과 같은 간단한 bash 스크립트를 가지고 있습니다.foo.sh이와 같이:
#!/bin/bash
echo "Foo!"
./foo.sh
메시지를 받았을 때 실행하면 Foo!
모든 것이 정상입니다. 그러나 echo "Foo!"
콘솔에서 직접 이동하면 예상되는 동작과 메시지가 나타납니다 bash: !": event not found
.
내가 아는 한, the는 !
이전 명령으로 렌더링되며 pe 작은따옴표 안에 사용되면 리터럴로 처리됩니다. 스크립트를 실행하는 것의 차이점이 무엇인지 궁금합니다 echo "Foo!"
. 작동하더라도 source ./foo.sh
콘솔에서 직접 실행하는 것은 그렇지 않습니다.
답변1
기본적으로 대화형 bash 쉘은 기록 확장을 활성화합니다(이것이 동작을 제어합니다 !
). 소스 파일(대부분 역사적 확장 개념 외부에 존재함)과 스크립트는 그렇지 않습니다. man bash
( 또는온라인 매뉴얼):
set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
-H
:!
스타일 기록 교체를 활성화합니다. 이 옵션은 셸이 대화형일 때 기본적으로 활성화됩니다.
set [+-]H
이 동작은 , 또는 를 사용하여 수동으로 조정할 수 있습니다. set [+-]o histexpand
여기서 -H
/-o
만들다역사적 확장 및 +H
/+o
장애를 입히다그것.
예를 들면 다음을 참조하세요.