很多时候,程序员在大众的眼中就是一群面对黑色背景和白色字母创造出各种好玩事物的人。然而,在各类工具的加持之下,大部分程序员已经不再仅仅依靠黑底白字的命令行来完成自己的工作。酷炫的编辑器、边界的界面化工具等效率产品的出现,让我们对于命令行的接触机会变得越来越少。很多时候,一些年轻程序员会觉得命令行的学习已经不重要了,不需要再花时间去掌握。如果您也是这样想的,那么这个5万星的开源项目,值得您关注学习一下。
- 开源项目名称:命令行的艺术
- Github地址:https://github.com/jlevy/the-art-of-command-line
该项目与其他产品类项目不同,它仅仅是一篇文章,但是却被翻译成了17种语言,拥有高达5万的星星,足以见得该项目的广泛认可度。那么下面就来一次学习一下这篇文章吧:
熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。
这篇文章是许多作者和译者共同的成果。 这里的部分内容首次出现于 Quora,但已经迁移到了 Github,并由众多高手做出了许多改进。如果你在本文中发现了错误或者存在可以改善的地方,请贡献你的一份力量。
前言
涵盖范围:
- 这篇文章不仅能帮助刚接触命令行的新手,而且对具有经验的人也大有裨益。本文致力于做到覆盖面广(涉及所有重要的内容),具体(给出具体的最常用的例子),以及简洁(避免冗余的内容,或是可以在其他地方轻松查到的细枝末节)。在特定应用场景下,本文的内容属于基本功或者能帮助您节约大量的时间。
- 本文主要为 Linux 所写,但在仅限 OS X 系统章节和仅限 Windows 系统章节中也包含有对应操作系统的内容。除去这两个章节外,其它的内容大部分均可在其他类 Unix 系统或 OS X,甚至 Cygwin 中得到应用。
- 本文主要关注于交互式 Bash,但也有很多技巧可以应用于其他 shell 和 Bash 脚本当中。
- 除去“标准的”Unix 命令,本文还包括了一些依赖于特定软件包的命令(前提是它们具有足够的价值)。
注意事项:
- 为了能在一页内展示尽量多的东西,一些具体的信息可以在引用的页面中找到。我们相信机智的你知道如何使用 Google 或者其他搜索引擎来查阅到更多的详细信息。文中部分命令需要您使用 apt-get, yum, dnf, pacman, pip 或 brew(以及其它合适的包管理器)来安装依赖的程序。
- 遇到问题的话,请尝试使用 Explainshell 去获取相关命令、参数、管道等内容的解释。
基础
- 学习 Bash 的基础知识。具体地,在命令行中输入 man bash 并至少全文浏览一遍; 它理解起来很简单并且不冗长。其他的 shell 可能很好用,但 Bash 的功能已经足够强大并且到几乎总是可用的( 如果你只学习 zsh,fish 或其他的 shell 的话,在你自己的设备上会显得很方便,但过度依赖这些功能会给您带来不便,例如当你需要在服务器上工作时)。
- 熟悉至少一个基于文本的编辑器。通常而言 Vim ( vi) 会是你最好的选择,毕竟在终端中编辑文本时 Vim 是最好用的工具(甚至大部分情况下 Vim 要比 Emacs、大型 IDE 或是炫酷的编辑器更好用)。
- 学会如何使用 man 命令去阅读文档。学会使用 apropos 去查找文档。知道有些命令并不对应可执行文件,而是在 Bash 内置好的,此时可以使用 help 和 help-d 命令获取帮助信息。你可以用 type命令 来判断这个命令到底是可执行文件、shell 内置命令还是别名。
- 学会使用 > 和 < 来重定向输出和输入,学会使用 | 来重定向管道。明白 > 会覆盖了输出文件而 >> 是在文件末添加。了解标准输出 stdout 和标准错误 stderr。
- 学会使用通配符 * (或许再算上 ? 和 [... ]) 和引用以及引用中 ' 和 " 的区别(后文中有一些具体的例子)。
- 熟悉 Bash 中的任务管理工具: &,ctrl-z,ctrl-c, jobs, fg, bg, kill 等。
- 学会使用 ssh 进行远程命令行登录,最好知道如何使用 ssh-agent, ssh-add 等命令来实现基础的无密码认证登录。
- 学会基本的文件管理工具: ls 和 ls-l (了解 ls-l 中每一列代表的意义), less, head, tail 和 tail-f (甚至 less+F), ln 和 ln-s (了解硬链接与软链接的区别), chown, chmod, du (硬盘使用情况概述: du-hs*)。 关于文件系统的管理,学习 df, mount, fdisk, mkfs, lsblk。知道 inode 是什么(与 ls-i 和 df-i 等命令相关)。
- 学习基本的网络管理工具: ip 或 ifconfig, dig。
- 学习并使用一种版本控制管理系统,例如 git。
- 熟悉正则表达式,学会使用 grep/ egrep,它们的参数中 -i, -o, -v, -A, -B 和 -C 这些是很常用并值得认真学习的。
- 学会使用 apt-get, yum, dnf 或 pacman (具体使用哪个取决于你使用的 Linux 发行版)来查找和安装软件包。并确保你的环境中有 pip 来安装基于 Python 的命令行工具 (接下来提到的部分程序使用 pip 来安装会很方便)。
日常使用
- 在 Bash 中,可以通过按 Tab 键实现自动补全参数,使用 ctrl-r 搜索命令行历史记录(按下按键之后,输入关键字便可以搜索,重复按下 ctrl-r 会向后查找匹配项,按下 Enter 键会执行当前匹配的命令,而按下右方向键会将匹配项放入当前行中,不会直接执行,以便做出修改)。
- 在 Bash 中,可以按下 ctrl-w 删除你键入的最后一个单词,ctrl-u 可以删除行内光标所在位置之前的内容,alt-b 和alt-f 可以以单词为单位移动光标,ctrl-a 可以将光标移至行首,ctrl-e 可以将光标移至行尾,ctrl-k 可以删除光标至行尾的所有内容,ctrl-l 可以清屏。键入 man readline 可以查看 Bash 中的默认快捷键。内容有很多,例如 alt-. 循环地移向前一个参数,而 alt-* 可以展开通配符。
- 你喜欢的话,可以执行 set-o vi 来使用 vi 风格的快捷键,而执行 set-o emacs 可以把它改回来。
- 为了便于编辑长命令,在设置你的默认编辑器后(例如 exportEDITOR=vim),ctrl-x ctrl-e 会打开一个编辑器来编辑当前输入的命令。在 vi 风格下快捷键则是 escape-v。
- 键入 history 查看命令行历史记录,再用 !n( n 是命令编号)就可以再次执行。其中有许多缩写,最有用的大概就是 !$, 它用于指代上次键入的参数,而 !! 可以指代上次键入的命令了(参考 man 页面中的“HISTORY EXPANSION”)。不过这些功能,你也可以通过快捷键 ctrl-r 和 alt-. 来实现。
- cd 命令可以切换工作路径,输入 cd~ 可以进入 home 目录。要访问你的 home 目录中的文件,可以使用前缀 ~(例如 ~/.bashrc)。在 sh 脚本里则用环境变量 $HOME 指代 home 目录的路径。
- 回到前一个工作路径: cd-。
- 如果你输入命令的时候中途改了主意,按下 alt-# 在行首添加 # 把它当做注释再按下回车执行(或者依次按下 ctrl-a, #, enter)。这样做的话,之后借助命令行历史记录,你可以很方便恢复你刚才输入到一半的命令。
- 使用 xargs ( 或 parallel)。他们非常给力。注意到你可以控制每行参数个数( -L)和最大并行数( -P)。如果你不确定它们是否会按你想的那样工作,先使用 xargs echo 查看一下。此外,使用 -I{} 会很方便。例如:
find . -name '*.py' | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostname
- pstree-p 以一种优雅的方式展示进程树。
- 使用 pgrep 和 pkill 根据名字查找进程或发送信号( -f 参数通常有用)。
- 了解你可以发往进程的信号的种类。比如,使用 kill-STOP[pid] 停止一个进程。使用 man7signal 查看详细列表。
- 使用 nohup 或 disown 使一个后台进程持续运行。
- 使用 netstat-lntp 或 ss-plat 检查哪些进程在监听端口(默认是检查 TCP 端口; 添加参数 -u 则检查 UDP 端口)或者 lsof-iTCP-sTCP:LISTEN-P-n (这也可以在 OS X 上运行)。
- lsof 来查看开启的套接字和文件。
- 使用 uptime 或 w 来查看系统已经运行多长时间。
- 使用 alias 来创建常用命令的快捷形式。例如: aliasll='ls -latr' 创建了一个新的命令别名 ll。
- 可以把别名、shell 选项和常用函数保存在 ~/.bashrc,具体看下这篇文章。这样做的话你就可以在所有 shell 会话中使用你的设定。
- 把环境变量的设定以及登陆时要执行的命令保存在 ~/.bash_profile。而对于从图形界面启动的 shell 和 cron启动的 shell,则需要单独配置文件。
- 要想在几台电脑中同步你的配置文件(例如 .bashrc 和 .bash_profile),可以借助 Git。
- 当变量和文件名中包含空格的时候要格外小心。Bash 变量要用引号括起来,比如 "$FOO"。尽量使用 -0 或 -print0 选项以便用 NULL 来分隔文件名,例如 locate-0pattern|xargs-0ls-al 或 find/-print0-type d|xargs-0ls-al。如果 for 循环中循环访问的文件名含有空字符(空格、tab 等字符),只需用 IFS=