스크립트에서 기록 확장이 비활성화되어 있습니까?

스크립트에서 기록 확장이 비활성화되어 있습니까?

!기록 확장을 사용하면 다음 오류가 발생하는 것으로 알고 있습니다 .

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

그러나 명령을 스크립트에 넣고 스크립트를 실행하면 문제가 없습니다.

$ cat myscript
echo "Hello!Tim"
$ bash myscript 
Hello!Tim

왜 그런 겁니까? bash 매뉴얼에 이유가 언급되어 있습니까?

답변1

예, 기록 확장은 기본적으로 대화형 셸에서만 활성화됩니다.

쉘 스크립트에 대해 이를 활성화하려면 다음을 작성하십시오.

set -H

대화형 셸에서 비활성화하려면 다음을 작성하세요.

set +H

현재 기록 확장이 활성화되어 있는지 확인하려면 다음 코드의 일부 형식을 사용하십시오.

case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac

쉘 강좌를 가르치기 시작하면서 매뉴얼을 꼼꼼히 읽어보았어요넓게"대화형 쉘"이 실제로 무엇을 의미하는지 확인해보세요. 이것은 소용돌이 모양의 질문이므로 몇 가지 문제를 해결하겠습니다.

쉘에는 많은 옵션이 있습니다. 이러한 옵션 중 일부는 쉘이 제어 터미널로 시작될 때(또는 등을 사용하여 아래 참조) -i다르게 초기화됩니다 .

쉘의 모든 옵션은 개별적으로 변경할 수 있습니다.

"대화형 쉘"은 정확하게 정의하려고 하면 기만적인 용어입니다. 실제로는 옵션 설정 모음일 뿐입니다.

어떤 설정이 쉘을 대화형으로 만드는지 여부에 대한 질문은 대답할 수 없습니다. 이것은정확하게같은 철학적 질문테세우스의 배.

대화형 쉘을 시작했지만 히스토리 확장을 비활성화하고 flag --noediting, set --norc, close off expand_aliases등을 사용하는 경우 쉘은 어떤 의미에서 대화형입니까? 아니면 언제 상호작용이 중단되나요? 이 질문에는 답할 수 없습니다.

실제로 "대화형"은 다양한 셸 옵션 모음에 대한 편의 레이블일 뿐입니다. 또한 "비대화형"입니다. 동일합니다. 각각의 동작을 개별적으로 변경할 수 있는 동작 모음입니다.

결론: 쉘은 "비대화형"으로 시작할 때와 "대화형으로" 시작할 때 다르게 동작합니다. 이 용어를 정확하게 정의해보세요.시동 후아주 멍청한. 동작을 이해하려면 셸의 각 개별 옵션을 살펴보세요.


나는 내 자신의 연구 외에도 이 사이트에 이에 대해 광범위하게 게시한다는 사실을 잊어버렸습니다.

관련 정보