命令行 Zsh 中的注释

我在 Ubuntu 上从 Bash 切换到了 Zsh,我对此感到非常高兴。然而,有些东西我真的很想念,我没有找到如何实现同样的事情。

在 Bash 中,每当我输入一个长命令并注意到之前必须运行其他命令时,我只需要像下面这样注释掉它:

me@home> #mysuperlongcommand with some arguments
me@home> thecommandIhavetorunfirst #and then: up up
me@home> #mysuperlongcommand with some arguments #I just need to uncomment it!

然而,这种相当反复出现的情况并不像使用 zsh那样容易解决,因为 #mysuperlongcommand将以这种方式运行(并导致: zsh: command not found: #mysuperlongcommand)。

36777 次浏览

我发现自己也经常这样做。我所做的就是删除长命令,执行需要首先执行的命令,然后将长命令粘贴回去。这很简单: CTRL + U将当前命令剪切到一个缓冲区中,CTRL + Y将其粘贴。在 zsh 和 bash 中工作。

我吸毒

bindkey "^Q" push-input

来自 zsh 手册:

将整个当前多行结构推到缓冲堆栈上,然后返回到顶级(PS1)提示符。如果当前的解析器结构只有一行,那么这与 push-line 非常相似。下次编辑器启动或使用 get-line 弹出时,构造将从缓冲堆栈的顶部弹出并加载到编辑缓冲区中。

看起来是这样的:

> long command
Ctrl+Q => long command disappears to the stack
> forgotten command
long command reappears from stack
> long command

另外,如果设置 INTERACTIVE_COMMENTS选项(setopt INTERACTIVE_COMMENTS) ,您将能够像以前一样在交互式 shell 中使用注释。

刚开始尝试 zsh 时,我也遇到了这个问题。您可以执行 setopt interactivecomments来激活 bash 样式的注释。

这是 ksh(Korn shell)和 sh(Bourne shell)的默认行为,我猜对于 bash(Bourne-again shell)也是如此,但对于 zsh(Z shell)却不是默认行为:

在下面的列表中,所有模拟中默认设置的选项都被标记为 <D>; 那些仅在 csh、 ksh、 sh 或 zsh 模拟中默认设置的选项被适当地标记为 <C><K><S><Z>

(- k) <K> <S> 即使在交互式 shell 中也允许注释。

除了@Lajld 建议的 setopt interactivecomments之外,您可能还需要添加以下内容,以防止某些评论被写入历史(来自 https://superuser.com/questions/352788/how-to-prevent-a-command-in-the-zshell-from-being-saved-into-history) :

这将覆盖 ZSH 内置函数 zhaddhistory () :

  • 将记录从第1列开始但后面没有一个或多个空格的注释(例如 # some 命令,我想返回到该命令)
  • 不会记录从第1列开始后跟一个或多个空格的注释
  • 不会记录缩进的注释,由第1列的空格填充
  • 不会使用第1列中的空格记录命令(运行不希望记录的命令的方便快捷方式)
setopt interactivecomments


function zshaddhistory() {
emulate -L zsh
if ! [[ "$1" =~ "(^#\s+|^\s+#|^ )" ]] ; then
print -sr -- "${1%%$'\n'}"
fc -p
else
return 1
fi
}

作为参考,这是默认的 zhaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
print -sr -- ${1%%$'\n'}
fc -p .zsh_local_history
}
: sh generate_sample.sh arg1

添加“ :”不执行 zsh 中的命令。

sh generate_sample.sh : arg1

现在,arg1被注释了。

我在 Mac OS Big Sur 上使用了很多次。

编辑: “ :”过程不给空格。“ : 命令”是正确的,但“ : 命令”不正确

将代码行 setopt INTERACTIVE_COMMENTS添加到 ~/.zshrc文件中,保存它,然后重新启动 shell。

这是为了澄清@Lajld 的回答和@Hamish Downer 的评论。我只是花了一点时间才弄明白如何让这个改变永久化。您可能希望在导出变量之前添加这一行,因此可以将其添加到文件的顶部。我在 ~/.zshrc文件中已经有了 setopt PROMPT_SUBST,所以我只是在那一行之后添加了它。这将确保每次启动 zsh 终端时都加载设置。