命令行是程序员的必备技能。
关于命令行容易混淆的概念简析
1. CLI
命令行(Command-line interface - CLI)是在 图形用户界面 (Graphical user interface - GUI) 得到普及之前使用最为广泛的 用户界面。
命令行要较图形用户界面 节约计算机系统资源 。在熟记命令的前提下,使用命令行往往要较使用图形用户界面的操作速度快。所以,现在的操作系统中通常保留着可选的命令行界面。
操作系统的图形化操作方式对单一客户端计算机的操作相当方便,但如果是一群客户端计算机,或者是24小时运作的服务器计算机,图形化操作方式有时会力有未逮,所以需要不断增强命令行界面的 脚本语言 和 宏语言 来提供丰富的控制与自动化的系统管理能力,例如 Linux 系统的 Bash 或是 Windows 系统的 Windows PowerShell 。
2. Shell
Shell 俗称壳(用来区别于核),是指 “为使用者提供使用界面用来交互” 的软件(命令解析器)。它类似于 DOS(Disk Operation System - 磁盘操作系统) 下的 command 和后来的 cmd.exe。它接收用户命令,然后调用相应的应用程序。
命令行由 Shell 提供。各种命令通过 Shell,传递给操作系统的内核。学习命令行就是在学习 Shell。
Shell 分很多种,Unix 上常见使用 Bash Shell,Mac 也是默认用 Bash,但也有人推荐改用 Zsh 更为花俏。Windows 则是用 PowerShell。Shell 可以只当作是 Shell command 用,也可以当作 Shell script 使用,就像编程语言一样。
3. .bat 和 .cmd
批处理文件(Batch File)(后缀名“.bat”)是在 DOS 下最常用的可执行文件。所谓批处理,就是按顺序自动执行若干个指定的 DOS 命令或程序,即把原来一个个执行的命令汇总起来成批的执行。而此程序文件可以移植到其它电脑中运行,因此可以大大节省命令反复输入的繁琐。
同时批处理文件还有一些编程的特点,可以通过扩展参数来灵活的控制程序的执行,所以在日常工作中非常实用。
现今批处理文件已不止支持 DOS 的程序,同时也支持 Windows(在 Windows NT 以后的平台中,还加入了 .cmd 扩展名的批处理文件,其性能比 .bat 更优越,执行与 .bat 文件一样方便)。
由于 .bat 文件是基于16平台下的程序,在 Windows NT 及以后的 32 位中运行时偶尔会出现 堆栈溢出之类的错误,所以建议在新的系统中尽可能的采用 .cmd 扩展的批处理文件代替 .bat 的文件。
4. 其他名词
Terminal 是指 CLI 输入输出的界面程序,例如 mac 内建的 Terminal,或是另外装的 iTerm2。使用 Terminal 时会需要设定要用哪一种 Shell。
Console 指某特定的指令语言环境,例如 mysql console (输入 SQL 指令)、irb console (输入 Ruby 程序)、rails console (输入 rails 程序)。
命令行是程序员的必备技能。 图形界面虽然好看,解决问题还是要靠命令行。
常用指令手册
Terminal 窗口操作
1 | Control+c 取消目前指令 |
简单的 CLI
1 | # 这些指令 Mac 和 Linux 大部分都是通用的 |
特殊的环境变量 - PATH
执行 which date
和 which uptime
时,显示两个命令真正的位置放在 /bin/date
和 /usr/bin/uptime
。为什么 Linux 知道要去哪些目录找呢? 为什么不需要执行 /bin/date
,只需要执行 date
就够了?
在 Linux 中有个特别的环境变量叫做 PATH
,你可以用 echo
指令来输出,如:1
echo $PATH # 输出 PATH 的值
用 export
指令可以设定环境变量:1
export TEST=100
CLI 参考资料
- 快乐的 Linux 命令行 http://billie66.github.io/TLCL/
- Unix/Linux 命令参考 https://i.linuxtoy.org/files/pdf/fwunixref.pdf
- Ten Steps to Linux Survival http://www.oreilly.com/programming/free/ten-steps-to-linux-survival.csp
- Command Line Crash Course https://learnpythonthehardway.org/book/appendixa.html
命令行工具选择
Shell 有好几种,目前最常用是 Bash(Mac 的 Terminal 和 iTerm 都是它) 和 zsh。此处介绍一个好用的 Fish Shell。
简介
Fish 是 “the Friendly Interactive Shell” 的简称,最大特点就是方便易用。很多其他 Shell 需要配置才有的功能,Fish 默认提供,不需要任何配置。
如果你想拥有一个方便好用的 Shell,又不想学习一大堆语法,或者花费很多时间配置,那么你一定要尝试一下 Fish。
安装
Mac 的安装方法:
1 | $ brew install fish |
其他系统的安装请参考官网。
启动与帮助
安装完成后会提示将 fish 设为默认 shell,如下图:
由于 Fish 的语法与 bash 有很大差异,Bash 脚本一般不兼容。因此,建议不要将 Fish 设为默认 Shell,而是每次手动启动它。
使用过程中,如果需要帮助,可以输入help命令。浏览器就会自动打开,显示 fish 帮助文档。
特点
敲入几个命令试试,先感受下,感觉到方便了吗?
区别显示
- 无效命令为红色,有效命令为蓝色
- 有效路径会有下划线
自动建议 和 补全
1 | # 命令 |
采纳建议,可以按 → 或 Control + F。如果只采纳一部分,可以按 Alt + →。
按 Tab 自动补全,如果有多个可能的结果,Fish 会把它们都列出,还带有简要介绍。再按一次 tab,就可以在这些命令之中选择。
易懂的语法
1 | if grep fish /etc/shells |
1 | switch (uname) |
1 | while true |
1 | for file in *.txt |
函数
Fish 的函数用来封装命令,或者为现有的命令起别名。
1 | function ll |
上面代码定义了一个 ll 函数。命令行执行这个函数以后,就可以用 ll 命令替代 ls -lhG。其中,变量 $argv 表示函数的参数。
下面是另一个例子。
1 | function ls |
上面的代码重新定义 ls 命令。注意,函数体内的 ls 之前,要加上 command,否则会因为无限循环而报错。
配置
Fish 的配置文件是 ~/.config/fish/config.fish,每次 Fish 启动,就会自动加载这个文件。我们可以在这个文件里面写入各种自定义函数,它们会被自动加载。
Fish 还提供 Web 界面配置该文件:
1 | $ fish_config |
输入上面的命令以后,浏览器就会自动打开本机的 8000 端口,用户可以在网页上对 Fish 进行配置,比如选择提示符和配色主题。按回车结束配置。