나는 대부분의 삶을 IPython 셸에서 보냈기 때문에 터미널 명령 앞에 느낌표를 붙이는 나쁜 습관이 있습니다. 일반적으로 이로 인해 오류가 발생하지만 때로는 나쁜 일이 발생하기도 합니다. !
터미널의 기능을 효과적으로 비활성화할 수 있나요 ? 이것이 스크립트를 방해할 위험이 있나요?
답변1
대화형 셸에서는 기본적으로 !
기록 확장을 위해 셸이 다음 텍스트와 일치하는 명령을 찾고 !
해당 명령을 실행합니다. 에 표시된 바와 같이이 답변도착하다Bash에서 느낌표(!)를 사용할 수 없나요?셸에서는 기록 확장을 비활성화할 수 있습니다.
- 큰 타격:
set +H
- 지쉬어:
set -K
느낌표 기반 기록 확장을 사용하지 않으려면 이를 쉘의 시작 스크립트에 추가하면 됩니다.
이는 !
무시되지 않지만 기록에서 명령 실행을 방지합니다. 존재하지 않는다고 !command
불평할 것이다 !command
.
쉘 스크립트는 이러한 설정의 영향을 받지 않으며 비대화형 구성을 사용하여 자체 쉘을 얻습니다(히스토리 확장은 기본적으로 포함되지 않음).
답변2
절대 사용하지 않는다면! 터미널에서 (내 경우에는) wasase와 같이 절대 사용하지 않는 기능에 이를 할당할 수 있습니다.
stty werase !
그럼 입력할 때마다! , 이전 단어만 삭제됩니다. 터미널 명령 시작 부분에 입력하면 전혀 효과가 없습니다.
실제 느낌표가 필요한 경우 lnext
CTRL-V(또는 귀하의 역할이 무엇이든)를 앞에 붙여 인용/이스케이프하여 입력할 수 있습니다.
일반적으로 이 기능을 사용하지 않는 경우 lnext
재정의하는 lnext
것이 더 편리 할 수 있습니다 !
. 이렇게 하면 느낌표를 두 번 입력하여(첫 번째는 두 번째를 나타냄) 느낌표를 입력할 수 있습니다.
stty lnext !
작동 방식에 대한 자세한 설명:
기능은 다음 lnext
과 같습니다. "다음 문자를 특수 문자로 해석하지 말고 해당 문자만 입력으로 받아들입니다." stty 특수문자인 경우 특수기능은 적용되지 않고 문자 자체만 사용됩니다. 여기에는 lnext
기능에 할당된 문자가 포함됩니다.
기본 lnext
문자는 CTRL-V입니다(니모닉: "verbatim", 예: 다음 문자를 그대로 입력). 여기서는 해당 기능을 역할에 다시 할당합니다 !
.
lnext
대부분의 경우 효과가 "효과 없음"이기 때문에 주로 선택되었습니다(예: 다음 문자가 일반 문자인 경우). 실수로 !
줄 시작 부분에 입력한 경우 다음 문자는 거의 항상 일반 문자이므로 특별한 조작이 필요하지 않으므로 이를 인용/이스케이프 처리(명시적으로 일반 문자로 처리)해도 아무런 해가 없습니다. a
an 뒤에 an을 쓸 때 !
의미는 "write one a
"에서 동일한 기능을 제공하는 보다 구체적인 의미로 변경됩니다. "one을 쓰고 a
, 다른 것은 무시하고, 그냥 하세요!"
실제 캐릭터를 생성하려면 !
이 lnext
함수를 사용하여 참조할 수 있습니다. 따라서 입력하면 !!
하나를 입력하게 됩니다.!
답변3
쉘을 사용하는 경우 zsh
다음을 추가할 수 있습니다 ~/.zshrc
.
zmodload zsh/zselect
bang() {
zle self-insert
if [[ $CONTEXT = start && $LBUFFER =~ '^!+$' ]]; then
local -a old_region_highlight=($region_highlight)
region_highlight+=("0 $CURSOR fg=red,bg=white,bold,standout")
zle -R 'Will you please stop?!'
zselect -t 100 -r 0 < /dev/tty
region_highlight=($old_region_highlight)
LBUFFER=
fi
}
zle -N bang
bindkey '!' bang
이렇게 하면 !
편집 버퍼의 시작 부분에 하나 이상을 입력하면 빨간색으로 강조 표시되고 메시지가 표시되며 삭제됩니다(1초 후 또는 다른 항목을 입력한 경우 더 빠르게).