Zorgoth Asked: 2019-12-06 06:12:38 +0800 CST2019-12-06 06:12:38 +0800 CST 2019-12-06 06:12:38 +0800 CST 我可以在终端中忽略前导感叹号吗?(由于 ipython,我本能地输入它们) 772 因为我大部分时间都在 IPython shell 中度过,所以我养成了在终端命令前加上感叹号的坏习惯。通常,这只会导致错误,但有时,它会导致一些不好的事情发生。我可以有效地禁用!终端中的功能吗?这种风险会干扰任何脚本吗? bash command-line 3 个回答 Voted Best Answer Stephen Kitt 2019-12-06T06:25:25+08:002019-12-06T06:25:25+08:00 默认情况下,在交互式 shell 中,!用于历史扩展:shell 将查找与后面的文本匹配的命令!,并执行该命令。正如对Can't use exclamation mark (!) in bash ? shell 允许禁用历史扩展: 重击:set +H Zsh:set -K 如果您不想使用由感叹号驱动的历史扩展,您可以将它们添加到您的 shell 的启动脚本中。 这些不会导致!被忽略,但它们会避免运行历史记录中的命令。!command会抱怨!command不存在。 Shell 脚本不受这些设置的影响,它们拥有自己的具有非交互式配置的 shell(默认情况下不包括历史扩展)。 L. Scott Johnson 2019-12-06T06:40:36+08:002019-12-06T06:40:36+08:00 如果你从不使用!从终端,您可以将其分配给您也从未使用过的功能,例如(在我的情况下)werase: stty werase ! 然后每当你输入!,它只会删除前一个单词。如果您只在终端命令的开头键入它,那么这将根本没有效果。 如果您需要一个实际的感叹号,您仍然可以通过在它前面加上 CTRL-V(或任何您的lnext字符)来引用它/转义它来输入它。 如果您通常不使用该功能,您可能会发现重新定义为lnext更方便;这将允许您通过输入两次来输入感叹号(第一个引用第二个)。lnext! stty lnext ! 关于其工作原理的更详细说明: 功能是:“不要将lnext下一个字符解释为任何特殊内容:只需将字符原样作为输入接受”。如果它是一个 stty 特殊字符,则不要应用该特殊功能,而只是使用该字符本身。这包括分配给lnext函数的字符。 默认lnext字符为 CTRL-V(助记符:“逐字”,如:逐字输入下一个字符)。在这里,我们将这个函数重新分配给角色!。 lnext选择它主要是因为它的效果在大多数情况下是“没有效果”(例如,当输入的下一个字符是普通字符时)。当您不小心在行首键入!时,下一个字符几乎总是一个普通字符,没有特殊操作,因此引用/转义它(将其明确视为普通字符)没有害处。当我们在 ana之后写 an!时,含义从“写一个a”变为更具体的含义a。 如果我们想创建一个实际的!角色,我们可以使用该lnext功能来引用它。因此,通过键入!!,输入一个单曲!。 Stéphane Chazelas 2019-12-07T04:21:49+08:002019-12-07T04:21:49+08:00 如果使用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 因此,当您!在编辑缓冲区的开头输入一个或多个时,它会以红色突出显示它们,给您一条消息并删除它们(一秒钟后,或者如果您键入其他任何内容,则更快)。
默认情况下,在交互式 shell 中,
!
用于历史扩展:shell 将查找与后面的文本匹配的命令!
,并执行该命令。正如对Can't use exclamation mark (!) in bash ? shell 允许禁用历史扩展:set +H
set -K
如果您不想使用由感叹号驱动的历史扩展,您可以将它们添加到您的 shell 的启动脚本中。
这些不会导致
!
被忽略,但它们会避免运行历史记录中的命令。!command
会抱怨!command
不存在。Shell 脚本不受这些设置的影响,它们拥有自己的具有非交互式配置的 shell(默认情况下不包括历史扩展)。
如果你从不使用!从终端,您可以将其分配给您也从未使用过的功能,例如(在我的情况下)werase:
然后每当你输入!,它只会删除前一个单词。如果您只在终端命令的开头键入它,那么这将根本没有效果。
如果您需要一个实际的感叹号,您仍然可以通过在它前面加上 CTRL-V(或任何您的
lnext
字符)来引用它/转义它来输入它。如果您通常不使用该功能,您可能会发现重新定义为
lnext
更方便;这将允许您通过输入两次来输入感叹号(第一个引用第二个)。lnext
!
关于其工作原理的更详细说明:
功能是:“不要将
lnext
下一个字符解释为任何特殊内容:只需将字符原样作为输入接受”。如果它是一个 stty 特殊字符,则不要应用该特殊功能,而只是使用该字符本身。这包括分配给lnext
函数的字符。默认
lnext
字符为 CTRL-V(助记符:“逐字”,如:逐字输入下一个字符)。在这里,我们将这个函数重新分配给角色!
。lnext
选择它主要是因为它的效果在大多数情况下是“没有效果”(例如,当输入的下一个字符是普通字符时)。当您不小心在行首键入!
时,下一个字符几乎总是一个普通字符,没有特殊操作,因此引用/转义它(将其明确视为普通字符)没有害处。当我们在 ana
之后写 an!
时,含义从“写一个a
”变为更具体的含义a
。如果我们想创建一个实际的
!
角色,我们可以使用该lnext
功能来引用它。因此,通过键入!!
,输入一个单曲!
。如果使用
zsh
外壳,您可以添加到您的~/.zshrc
:因此,当您
!
在编辑缓冲区的开头输入一个或多个时,它会以红色突出显示它们,给您一条消息并删除它们(一秒钟后,或者如果您键入其他任何内容,则更快)。