【问题标题】:How to interactively expand a bang command in bash?如何在 bash 中以交互方式扩展 bang 命令?
【发布时间】:2015-10-30 20:24:35
【问题描述】:

像 zsh 和 bash 这样的 Shell 有 bang 命令,这些命令以感叹号开头并扩展到用户历史记录中的项目。

要获取最后运行的命令的最后一个参数,可以使用!$,例如

$ echo one two three
$ echo !$ !$ !$
> three three three

在 zsh 中,可以交互地扩展这些 bang 命令:

touch foo bar
ls !$<TAB>

!$ 将扩展到 foo 内联。

这非常有用,因为它经常防止我出错:我按tab 展开并确保我做对了,当我有信心时按C-/ 撤消展开。

bash中有没有实现bang命令交互扩展的设置?

关于这个问题的子shell和一般变量的扩展怎么样(即echo $(uname)&lt;TAB&gt;echo Linuxecho $SHELL&lt;TAB&gt;echo /bin/bash)。

【问题讨论】:

  • 您的问题假设读者了解 zsh 中的 bang 命令是什么。如果您描述了您所追求的功能,您可能会接触到更广泛的受众。我猜M-。带有前缀参数的参数接近你想要的,但我没有用谷歌搜索。
  • structure.usc.edu/bash/bashref_8.html#SEC106 解释了可用的绑定。 M-C-e 进行一般扩展,因此您的第二个问题或多或少是什么。 (以后每篇帖子只有一个问题,拜托!)
  • 那么是的,M-。这样做。虽然我不明白为什么在你的第二个例子中结果是foo——我希望bar
  • 我没有信心发布基于此的答案,但如果您可以从这些指针中拼凑出一个令自己满意的答案,请受邀自己回答问题并将答案标记为已接受(我认为经过一段冷却期后)这样这个问题就不会再出现没有答案了。
  • 我经常遇到这个问题,在How to search for dollar sign or exclamation mark?问过。他们告诉我symbolhound.com 是您想要进行此类搜索时的解决方案。

标签: bash shell zsh


【解决方案1】:

您可以使用一些选项来扩展历史记录。一种是:p 修饰符,它打印扩展的命令而不是执行它。

$ echo foo
$ !!:p
echo foo

另一个是使用histverify选项,它将历史扩展的结果放在shell缓冲区中进行编辑而不是立即执行。

$ shopt -s histverify
$ echo foo
foo
$ !!
$ echo foo

如果您对该命令感到满意,只需再次按 Enter 即可执行它,就像您刚刚键入它一样。

默认情况下,Readline 命令history-expand-line 绑定到M-^Alt-^Esc-^,取决于您的终端模拟器作为元键发送的内容),这会扩展当前命令行上的任何历史扩展.

还有一个通用的 Readline 命令 shell-expand-line(默认绑定到 M-C-e),它在命令行上展开 everything,就像 shell 在按下 Enter 之后但实际上之前一样执行它。

【讨论】:

  • shell-expand-line readline 命令正是我想要的。 shopt -s histverify 也非常有用,谢谢。正如@tripleee 在 cmets 中指出的那样,获取最后一个命令(即!$)的最后一个参数的快捷方式是M-.Alt+.Esc-.)。
  • A Ctrl-x 也扩展了行(不执行)。
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 2020-12-04
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多