停止按向上(箭头)来查找上一个命令
有没有想过,有没有办法提高终端和 Shell 的效率?感觉有点笨重?以下是一些适合从未涉足系统管理或开发运维工作的朋友的小贴士。
问题:我是否需要多次向上按(箭头)才能找到需要运行的上一个命令?如果我只想再次运行上一个命令怎么办?
解决方案:拜托,别再(反复按向上键,然后目测)了!这效率低得可笑!三点建议!
-- FIRST --只需运行上一个命令而不离开键盘主行:(ctrl-p
“上一个”的助记符),然后按<Enter>
键。跳过了我们的命令?ctrl-n
(“下一个”的助记符)。
-- 第二 --如果我们知道这不是最后一个命令,以下可能是我最依赖的实用程序:reverse-i-search
。此实用程序将我们的(命令)history
视为堆栈,并(模糊)找到历史记录中存在的任何术语/关键字的最新匹配项。要初始化它,请点击ctrl-r
。一旦我们输入了某些内容,它就会到达我们的第一个匹配项。如果第一个匹配项不是我们要找的,则ctrl-r
再次点击,它将转到下一个上一个匹配项。如果我们已经过了它,请使用ctrl-s
/ <Shift>-ctrl-r
(取决于我们的操作系统)。要退出搜索,请使用ctrl-g
。这几乎完全消除了我对别名的所有使用。
假设我们的历史记录如下所示。注意:左侧的数字对应于我的 bash 历史记录中的行号
$ history
2311 ls -l
2312 rg --files | fzf
2313 vim reverse_singly_linked_list.py
2314 python -m unittest reverse_singly_linked_list.py
2315 ping google.com
2317 mix routes
2318 mix phx.routes
2319 git branch
2320 git log -3 --reverse
2322 htop
2326 jobs
2327 git status
2328 git diff -w
2329 ./deploy.sh
2330 less README.md
2331 man awk
现在,我在提示符下搜索包含以下字符的最后一个命令:test
。如果我们仔细查看上面的内容,我们会注意到它的命令编号2314
与我用 Python 为链表运行的单元测试相对应。大多数人的做法是按下十二次,我再说一遍,十二次!按下ctrl-r
,然后输入字符 ,test
就能找到完整的命令。我们只需按下 即可<Enter>
调用(运行)它。
👇 # what we type will display here
$ (reverse-i-search)`test': python -m unittest reverse_singly_linked_list.py
👆 # match begins here
-- 最后(第三步)——我们可以用管道符“ history
into ” grep
(不带尖括号)。这将提取包含给定术语的命令的所有匹配项。如果我们只能记住命令的某些片段,并且避免ctrl-r
在有多个匹配项时多次执行,这将非常有用。
$ history | grep <term/keyword(s)>
问题:这个东西有哪些选项?(一些 Unix 实用程序)我每次都要去 Google 吗?
解决方案:内置的 Unix 实用程序(例如ls
,,,,cd
)通常有很多选项。最快捷的参考资料之一是手册,也称为 man-pages,只需使用 ,即可轻松调用rm
(例如)。我发现(长格式)、(带目录的长格式)和(按时间排序的长格式)特别有用。xargs
ps
$ man <utility>
$ man ls
ls -l
ls -la
ls -lt
问题:好的,我现在正在使用手册页,但是我该如何浏览它或找到我要搜索的内容?这东西太大了!
解决方案:手册页通常采用vi格式(几乎所有 Unix/Linux 系统(包括 macOS)上都流行的文本编辑器)。搜索方式很简单,先点击/
(正斜杠)开始搜索,然后输入一些关键字或选项(例如/foobar
或),即可在页面中/-a
搜索foobar
或。-a
问题:好的,搜索只会带我到第一个匹配的实例。我该如何找到下一个?或者返回上一个?
解决方案:我们可以使用n
(小写字母和“下一个”的助记符)转到下一个实例,使用<Shift>-n
(大写字母)返回(上一个实例)
问题:有没有办法创建一个新目录并立即切换到该目录?
解决方案:$ mkdir foo && cd $_
。最后一个命令参数被捕获在_
(下划线) 变量中。要访问变量,我们使用$
前缀
问题:有没有更简单的方法在目录之间来回切换?
解决方案:使用-
$ pwd
/Users/me/Desktop
$ cd foo
foo $
$ pwd
/Users/me/Desktop/foo
$ cd -
/Users/me/Desktop
$ cd -
/Users/me/Desktop/foo
问题:如何在已输入的命令文本中移动或编辑上一个命令?如何跳转到行首或行尾?
解决方案:readline 快捷键 - 允许我们在一行内导航并执行编辑。这极大地提高了效率。令人惊讶的是,我们的大多数工具都是用 readline 构建的,所以这些快捷键通常在任何允许我们输入文本的地方都能使用(例如 Chrome 或 Firefox 地址栏、Google Doc 等),所以即使在 shell 之外,它们也值得学习。
试试这些。注意:在 macOS 上,我们必须配置 meta 键才能使基于 option 键的命令正常工作(操作方法见以下命令)。如果我们注重人体工程学,一个常见的按键重新映射方法是将 Caps-Lock 键更改为ctrl
。这可以通过系统键盘偏好设置的修饰键(在 macOS 上)来完成:
alt-b / option-b (macOS): move cursor back one word
alt-f / option-f (macOS): move cursor forward one word
ctrl-a: move cursor to the beginning of line
ctrl-b: move cursor backward (←)
ctrl-d: delete a character
ctrl-e: move cursor to the end of line
ctrl-f: move cursor forward (→)
ctrl-k: kill the line after the cursor, add to clipboard
ctrl-n: next line, next command in history (↓)
ctrl-p: previous line, previous command in history (↑)
ctrl-u: kill the line before the cursor, add to clipboard
ctrl-w: delete a word
ctrl-y: undo / paste from the clipboard
如何在 macOS 上的 iTerm2 中使用选项键设置前进和后退的元键:
- 前往个人资料 > 密钥
- 加载预设 > 自然文本编辑
- 从“正常”>“Esc+”切换左/右选项