使用我刚刚输入的前缀搜索上一个命令

ddz*_*wmm 104 shell bash command-history

我们可以使用向上和向下箭头在命令历史中导航。

在某些 IDE(例如 Matlab)中,如果我们输入一些内容然后按箭头键,我们只会在以我们输入的内容开头的历史命令之间滚动。这真的很方便,但是在 shell 终端中,这不起作用。

有没有办法在 shell 终端中获得类似的功能?还有其他提高终端使用效率的技巧吗?

Joh*_*024 147

您正在寻找的是CtrlR.

键入CtrlR,然后键入所需命令的一部分。Bash 将显示第一个匹配的命令。继续输入CtrlR,bash 将循环遍历以前的匹配命令。

要在历史记录中向后搜索,请键入CtrlS。(如果CtrlS这种方式对您不起作用,则可能意味着您需要禁用 XON/XOFF 流控制:要做到这一点,请运行stty -ixon.)

这在man bash.

  • **`Ctrl-Q`** 退出冻结状态,如果您已经点击 **`Ctrl-S`** 而没有先关闭流量控制并让您的终端被冻结。 (5认同)

egm*_*ont 44

将这些放在您的~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward
Run Code Online (Sandbox Code Playgroud)

这些按照您的意愿进行制作Page UpPage Down运行。(有些发行版已经为您配置了它。)我个人认为这些方式比Ctrl+Rhistory.

  • 我个人更喜欢覆盖上下箭头来做到这一点:`"\e[A": history-search-backward` 和 `"\e[B": history-search-forward` (6认同)
  • `~/.inputrc` 或 `/etc/inputrc` 或环境变量 `$INPUTRC` 引用的文件是所有使用 readline 的应用程序的行编辑配置文件,包括 bash(你的 shell)。它具有某些内置的行编辑功能,包括这两个功能:在 bash 的手册页中搜索这些关键字之一以了解更多信息。`\e[5~`/`\e[6~` 是大多数终端模拟器中Page Up/Down 键生成的转义序列;要查看它,请启动`cat` 命令,然后按下这些键(转义字节在终端中表示为`^[`,在inputrc 中表示为`\e`)。 (3认同)

Pet*_*des 12

除了 ^r / ^s 历史 i-search:

alt.在光标处插入上一个命令的最后一个“单词”。重复它以从旧命令中获取最后一个单词。(但请注意,尾随&算作后台命令的最后一个词)。

这对于mkdir foo, cdalt-dot非常方便。甚至比向上箭头,^一,ALT-d(删除向前字)更快,cd

要获得倒数第二个单词,请使用esc - 2 alt+.(即使用 emacs 样式的数字参数到alt+.。负数从末尾开始,正数从头开始。)但这通常比它的价值更麻烦;在某些时候,到达鼠标并复制/粘贴或向上箭头和 ^w / ^y 部分会更快(见下文)。


如果您的终端设置得很好/正确,则 ctrl-left 和 ctrl-right 将按单词向后/向前移动。如果没有,希望至少 alt-b 和 alt-f 会做同样的事情。


ctrl-/ 是一个撤消。如果您可以在稍微过冲时撤消,则可以使用自动重复来更有效地删除单词。


更强大的命令混合/匹配来自使用 kill-ring,它的工作方式与 Emacs 中的一样。ctrl-y 粘贴最后一个 ctrl-w / ctrl-u / ctrl-backspace / alt-d。alt-y 循环浏览较旧的已删除文本。

多个 ctrl-w 或任何一行在 kill-ring 条目上进行。如果您想删除两项内容并稍后仅粘贴一项,请使用向左和向右箭头或其他内容拆分条目。

将所有这些结合在一起,您可以

  • 开始输入命令
  • ctrl-r 返回旧命令并使用 control-w 或类似命令抓取其中的一部分。
  • esc-r 或alt+r将其恢复到删除部分之前的状态。
  • alt->转到历史的结尾(即一直向下箭头),返回到您在中间的命令。

其他互动使用技巧:

Enable shopt -s globstar,所以你可以做**/*.c(递归包括当前目录)。有时便于交互式使用,但通常find -name '*.c' -exec foo {} +更好。

如果您编写 bash 脚本,您会发现shopt -s extglob在交互式 shell 中启用也很方便。您有时会发现诸如*.!(c|h)匹配不以 .c 或 .h 结尾的文件之类的用途。

ls -lless以及您经常做的任何其他事情找到您喜欢的别名。( cp -i, mv -i, 和rm -I很好。不要养成依赖它们来做选择性 rm的习惯。GNU rm 的 -I 要求所有参数一次。)

我喜欢alias m=less(m 代表“更多”)。我已经less设置,.绑定到上一个/下一个文件 ( lesskey)。默认值是不能与自动重复一起使用的多按键序列。


我喜欢在 GNU screen 中做所有事情。我发现跟踪编号的屏幕窗口比 Konsole(或我尝试过的任何其他终端模拟器)中的大量标签更容易。如果您还不知道screen,请学习 tmux,因为它更新且不那么笨拙。

为了获得类似于打开一个与另一个 shell 具有相同 cwd 的新 shell 的功能,我为 cd/pushd/popdcds 8使用了一个自定义钩子,它让我可以将 cd 转到屏幕窗口 8 中我的 shell 正在使用的任何目录。 这甚至适用于 screen 会话之外的 shell,只要只有一个 screen 会话。


小智 9

将以下行添加到您的 ~/.inputrc

"\e[A": history-search-backward
"\e[B": history-search-forward
Run Code Online (Sandbox Code Playgroud)

这类似于 egmont 的答案,但它没有使用 Page Up 和 Page Down,而是使用 Arrow Up 和 Arrow Down 的转义序列。这种方式在 Mac 上使用起来更加方便。


Gra*_*avy 6

我通常使用的方法是将history命令与grep

IE:

history | grep <command im looking for>
Run Code Online (Sandbox Code Playgroud)

这将显示您键入的包含该命令的命令的编号历史记录,然后您可以使用:

!<number listed in history command>
Run Code Online (Sandbox Code Playgroud)

重做该命令。

IE:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history
Run Code Online (Sandbox Code Playgroud)

其次是: !571

会重复 history | grep history

  • @Gravy 固有的风险是不小心弄错了线路。不知道为什么您的终端会冻结,除非您使用 Control-S 并且启用了 xon/xoff 流量控制(通常是默认设置)。如果是这样,Control-Q 会将它带回来。 (3认同)
  • @Gravy 我怀疑 PSkocik 意味着 `!` 历史替换不太安全。 (2认同)

小智 5

我总是倾向于使用较大的HISTSIZE值配置我的机器,以便它保留更长的历史列表,以及带有时间戳值的HISTTIMEFORMAT,以便我可以看到命令何时运行。

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "
Run Code Online (Sandbox Code Playgroud)