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
.
egm*_*ont 44
将这些放在您的~/.inputrc
:
"\e[5~": history-search-backward
"\e[6~": history-search-forward
Run Code Online (Sandbox Code Playgroud)
这些按照您的意愿进行制作Page Up和Page Down运行。(有些发行版已经为您配置了它。)我个人认为这些方式比Ctrl+R或history
.
Pet*_*des 12
除了 ^r / ^s 历史 i-search:
alt.在光标处插入上一个命令的最后一个“单词”。重复它以从旧命令中获取最后一个单词。(但请注意,尾随&
算作后台命令的最后一个词)。
这对于mkdir foo
, cd
alt-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 条目上进行。如果您想删除两项内容并稍后仅粘贴一项,请使用向左和向右箭头或其他内容拆分条目。
将所有这些结合在一起,您可以
alt+r
将其恢复到删除部分之前的状态。>
转到历史的结尾(即一直向下箭头),返回到您在中间的命令。其他互动使用技巧:
Enable shopt -s globstar
,所以你可以做**/*.c
(递归包括当前目录)。有时便于交互式使用,但通常find -name '*.c' -exec foo {} +
更好。
如果您编写 bash 脚本,您会发现shopt -s extglob
在交互式 shell 中启用也很方便。您有时会发现诸如*.!(c|h)
匹配不以 .c 或 .h 结尾的文件之类的用途。
为ls -l
、less
以及您经常做的任何其他事情找到您喜欢的别名。( 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 上使用起来更加方便。
我通常使用的方法是将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
小智 5
我总是倾向于使用较大的HISTSIZE值配置我的机器,以便它保留更长的历史列表,以及带有时间戳值的HISTTIMEFORMAT,以便我可以看到命令何时运行。
export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "
Run Code Online (Sandbox Code Playgroud)