![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/7be4f8f599d3bcb777a62335320a1b9c.jpeg)
https://remysharp.com/2018/08/23/cli-improved
作者 | Remy Sharp
译者 | DavidChenLiang ??共计翻译:8.0 篇 贡献时间:94 天
我不确定有多少 Web 开发人员能全然避免使用命令行。就我来说。我从 1997 年上大学就開始使用命令行了,那时的 l33t-hacker 让我着迷,同一时候我也认为它非常难掌握。
过去这些年我的命令行本领在逐步加强,我常常会去搜寻工作中能用的更好的命令行工具。以下就是我如今使用的用于增强原有命令行工具的列表。
怎么忽略我所做的命令行增强
通常情况下我会用别名将新的增强的命令行工具覆盖原来的命令(如 cat
和 ping
)。
假设我须要执行原来的命令的话(有时我确实须要这么做)。我会像以下这样来执行未加改动的原始命令。(我用的是 Mac。你的使用方法可能不一样)
$ \cat # 忽略叫 "cat" 的别名 - 详细解释: https://stackoverflow.com/a/16506263/22617
$ command cat # 忽略函数和别名
bat > cat
cat
用于打印文件的内容,假设你平时用命令行非常多的话,比如语法高亮之类的功能会非常实用。我首先发现了 ccat[1] 这个有语法高亮功能的工具。然后我发现了 bat[2],它的功能有语法高亮、分页、行号和 git 集成。
bat
命令也能让我在(多于一屏的)输出里使用 /
搜索(和用 less
搜索功能一样)。
Sample bat output
我将别名 cat
指到了 bat
命令:
alias cat='bat'
prettyping > ping
ping
非常实用。当我碰到“糟了。是不是 X 挂了?/我的网不通了?”这样的情况下我最先想到的工具就是它了。可是 prettyping
(“prettyping” 可不是指“pre typing”)在 ping
的基础上加了友好的输出,这可让我感觉命令行友好了非常多呢。
Sample ping output
我也将 ping
用别名链接到了 prettyping
命令:
alias ping='prettyping --nolegend'
fzf > ctrl+r
在终端里,使用 ctrl+r
将同意你在命令历史里反向搜索[4]使用过的命令。这是个挺好的小技巧,虽然它有点麻烦。
fzf
这个工具相比于 ctrl+r
有了巨大的进步。
它能针对命令行历史进行模糊查询。而且提供了对可能的合格结果进行全面交互式预览。
除了搜索命令历史,fzf
还能预览和打开文件,我在以下的视频里展示了这些功能。
为了这个预览的效果,我创建了一个叫 preview
的别名,它将 fzf
和前文提到的 bat
组合起来完毕预览功能,还给上面绑定了一个定制的热键 ctrl+o
来打开 VS Code:
alias preview="fzf --preview 'bat --color \"always\" {}'"
# 支持在 VS Code 里用 ctrl+o 来打开选择的文件
export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(code {})+abort'"
htop > top
top
是当我想高速诊断为什么机器上的 CPU 跑的那么累或者风扇为什么突然呼呼大做的时候首先会想到的工具。我在生产环境也会使用这个工具。讨厌的是 Mac 上的 top
和 Linux 上的 top
有着极大的不同(恕我直言,应该是差的多)。
只是。htop
是对 Linux 上的 top
和 Mac 上蹩脚的 top
的极大改进。
它添加了包含颜色输出,键盘热键绑定以及不同的视图输出,这对理解进程之间的父子关系有极大帮助。
一些非常easy上手的热键:
◈P
—— 按 CPU 使用率排序◈
M
—— 按内存使用排序◈
F4
—— 用字符串过滤进程(比如仅仅看包含 node 的进程)◈
space
—— 锚定一个单独进程,这样我能观察它是否有尖峰状态
Sample htop output
在 Mac Sierra 上 htop 有个奇怪的 bug。只是这个 bug 能够通过以 root 执行来绕过(我实在记不清这个 bug 是什么。可是这个别名能搞定它,有点讨厌的是我得每次都输入 root password。
):
alias top="sudo htop" # 给 top 加上别名而且绕过 Sierra 上的 bug
diff-so-fancy > diff
我非常确定我是几年前从 Paul Irish 那儿学来的这个技巧,虽然我非常少直接使用 diff
,但我的 git 命令行会一直使用 diff
。
diff-so-fancy
给了我代码语法颜色和更改字符高亮的功能。
Sample diff output
在我的 ~/.gitconfig
文件中我用了以下的选项来打开 git diff
和 git show
的 diff-so-fancy
功能。
[pager]
diff = diff-so-fancy | less --tabs=1,5 -RFX
show = diff-so-fancy | less --tabs=1,5 -RFX
fd > find
虽然我使用 Mac,但我绝不是 Spotlight 的粉丝,我认为它的性能非常差,keyword也难记,加上更新它自己的数据库时会拖慢 CPU。简直一无是处。
我常常使用 Alfred[10],可是它的搜索功能也不是非常好。
我倾向于在命令行中搜索文件,可是 find
的难用在于非常难去记住那些合适的表达式来描写叙述我想要的文件。(而且 Mac 上的 find
命令和非 Mac 的 find
命令还有些许不同,这更加深了我的失望。
)
fd
是一个非常好的替代品(它的作者和 bat
的作者是同一个人)。
它非常快而且对于我常常要搜索的命令非常好记。
几个上手的样例:
$ fd cli # 全部包含 "cli" 的文件名称
$ fd -e md # 全部以 .md 作为扩展名的文件
$ fd cli -x wc -w # 搜索 "cli" 而且在每一个搜索结果上执行 `wc -w`
Sample fd output
◈ 安装指引 [11]ncdu > du
对我来说,知道当前磁盘空间被什么占用了非常重要。我用过 Mac 上的 DaisyDisk[12],可是我认为那个程序产生结果有点慢。
du -sh
命令是我常常会执行的命令(-sh
是指结果以“汇总”和“人类可读”的方式显示),我常常会想要深入挖掘那些占用了大量磁盘空间的文件夹。看看究竟是什么在占用空间。
ncdu
是一个非常棒的替代品。它提供了一个交互式的界面而且同意高速的扫描那些占用了大量磁盘空间的文件夹和文件,它又快又准。(虽然无论在哪个工具的情况下,扫描我的 home 文件夹都要非常长时间,它有 550G)
一旦当我找到一个文件夹我想要“处理”一下(如删除,移动或压缩文件),我会使用 cmd
+ 点击 iTerm2[13] 顶部的文件夹名字的方法在 Finder 中打开它。
Sample ncdu output
还有另外一个叫 nnn 的替代选择[14],它提供了一个更美丽的界面,它也提供文件尺寸和使用情况,实际上它更像一个全功能的文件管理器。
我的 du
是例如以下的别名:
alias du="ncdu --color dark -rr -x --exclude .git --exclude node_modules"
选项说明:
◈--color dark
使用颜色方案◈
-rr
仅仅读模式(防止误删和执行新的 shell 程序)◈
--exclude
忽略不想操作的文件夹◈
安装指引
[15]
tldr > man
差点儿全部的命令行工具都有一个相伴的手冊。它能够被 man <命令名>
来调出,可是在 man
的输出里找到东西可有点让人困惑。而且在一个包含了全部的技术细节的输出里找东西也挺可怕的。
这就是 TL;DR 项目(LCTT 译注:英文里“文档太长,没空去读”的缩写)创建的初衷。这是一个由社区驱动的文档系统,而且能够用在命令行上。
就我如今使用的经验,我还没碰到过一个命令没有它对应的文档。你也能够做贡献[16]。
Sample tldr output for fd
一个小技巧。我将 tldr
的别名链接到 help
(这样输入会快一点……)
alias help='tldr'
ack || ag > grep
grep
毫无疑问是一个强力的命令行工具,可是这些年来它已经被一些工具超越了。当中两个叫 ack
和 ag
。
我个人对 ack
和 ag
都尝试过,而且没有非常明显的个人偏好,(也就是说它们都非常棒,而且非常类似)。我倾向于默认仅仅使用 ack
,由于这三个字符就在指尖,非常好打。
而且 ack
有大量的 ack --bar
參数能够使用!(你一定会体会到这一点。)
ack
和 ag
默认都使用正則表達式来搜索,这非常契合我的工作,我能使用类似于 --js
或 --html
这样的标识指定文件类型搜索。(虽然 ag
比 ack
在文件类型过滤器里包含了很多其他的文件类型。
)
两个工具都支持常见的 grep
选项,如 -B
和 -A
用于在搜索的上下文里指代“之前”和“之后”。
Sample ack output with grep args
由于 ack
不支持 markdown(而我又恰好写了非常多 markdown)。我在我的 ~/.ackrc
文件中加了以下定制语句:
--type-set=md=.md,.mkd,.markdown
--pager=less -FRX
jq > grep 及其他
我是 jq[21] 的忠实粉丝之中的一个。当然一開始我也在它的语法里苦苦挣扎,好在我对查询语言还算有些使用心得,如今我对 jq
能够说是每天都要用。(只是从前我要么使用 grep
或者使用一个叫 json[22] 的工具。相比而言后者的功能就非常基础了。)
我甚至開始撰写一个 jq
的教程系列(有 2500 字而且还在添加),我还公布了一个网页工具[23]和一个 Mac 上的应用(这个还没有公布。
)
jq
同意我传入一个 JSON 而且能非常简单的将其转变为一个使用 JSON 格式的结果,这正是我想要的。
以下这个样例同意我用一个命令更新我的全部 node 依赖。(为了阅读方便。我将其分成为多行。)
$ npm i $(echo $(\
npm outdated --json | \
jq -r 'to_entries | .[] | "\(.key)@\(.value.latest)"' \
))
上面的命令将使用 npm 的 JSON 输出格式来列出全部过期的 node 依赖,然后将以下的源 JSON 转换为:
{
"node-jq": {
"current": "0.7.0",
"wanted": "0.7.0",
"latest": "1.2.0",
"location": "node_modules/node-jq"
},
"uuid": {
"current": "3.1.0",
"wanted": "3.2.1",
"latest": "3.2.1",
"location": "node_modules/uuid"
}
}
转换结果为:
node-jq@1.2.0
uuid@3.2.1
上面的结果会被作为 npm install
的输入,你瞧,我的升级就这样全部搞定了。
(当然。这里有点小题大做了。)
非常荣幸提及一些其他的工具
我也在開始尝试一些别的工具,但我还没有全然掌握它们。(除了 ponysay
,当我打开一个新的终端会话时。它就会出现。
)
◈ ponysay [24] >cowsay
◈
csvkit
[25] >
awk 及其他
◈
noti
[26] >
display notification
◈
entr
[27] >
watch
你有什么好点子吗?
上面是我的命令行清单。你的呢?你有没有试着去增强一些你每天都会用到的命令呢?请告诉我,我非常乐意知道。
via: https://remysharp.com/2018/08/23/cli-improved
作者:Remy Sharp[29] 选题:lujun9972 译者:DavidChenLiang 校对:pityonline, wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出