w h y y o u a r e h e r e ?

浅入浅出命令行

命令行是程序员的必备技能。

关于命令行容易混淆的概念简析

command-line interface

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
2
3
4
5
Control+c 取消目前指令
Control+z 中断目前指令
Control+a 跳到指令最前面
Control+e 跳到指令最后面
Control+l 清除画面 (或 clear )

简单的 CLI

1
2
3
4
5
6
7
# 这些指令 Mac 和 Linux 大部分都是通用的
date 会显示系统时间
uname -a 显示系统版本
uptime 查电脑开机多久了
which 查找并显示给定命令的绝对路径(也就是说,可以看到某个系统命令是否存在,以及执行的是哪一个位置的命令)
history 查询刚刚执行过的指令
man 查询指令文件,按 q 离开

特殊的环境变量 - PATH

执行 which datewhich uptime 时,显示两个命令真正的位置放在 /bin/date/usr/bin/uptime。为什么 Linux 知道要去哪些目录找呢? 为什么不需要执行 /bin/date,只需要执行 date 就够了?

在 Linux 中有个特别的环境变量叫做 PATH,你可以用 echo 指令来输出,如:

1
echo $PATH # 输出 PATH 的值

export 指令可以设定环境变量:

1
export TEST=100

CLI 参考资料

命令行工具选择

Shell 有好几种,目前最常用是 Bash(Mac 的 Terminal 和 iTerm 都是它) 和 zsh。此处介绍一个好用的 Fish Shell

简介

Fish 是 “the Friendly Interactive Shell” 的简称,最大特点就是方便易用。很多其他 Shell 需要配置才有的功能,Fish 默认提供,不需要任何配置。

如果你想拥有一个方便好用的 Shell,又不想学习一大堆语法,或者花费很多时间配置,那么你一定要尝试一下 Fish。

安装

Mac 的安装方法:

1
$ brew install fish

其他系统的安装请参考官网

启动与帮助

安装完成后会提示将 fish 设为默认 shell,如下图:

make fish your default shell

由于 Fish 的语法与 bash 有很大差异,Bash 脚本一般不兼容。因此,建议不要将 Fish 设为默认 Shell,而是每次手动启动它。

使用过程中,如果需要帮助,可以输入help命令。浏览器就会自动打开,显示 fish 帮助文档。

特点

敲入几个命令试试,先感受下,感觉到方便了吗?

区别显示

  • 无效命令为红色,有效命令为蓝色
  • 有效路径会有下划线

有效路径会有下划线

自动建议 和 补全

1
2
3
4
# 命令
# 参数
# 路径
# Git 分支

采纳建议,可以按 → 或 Control + F。如果只采纳一部分,可以按 Alt + →。

按 Tab 自动补全,如果有多个可能的结果,Fish 会把它们都列出,还带有简要介绍。再按一次 tab,就可以在这些命令之中选择。

易懂的语法

1
2
3
4
5
6
7
if grep fish /etc/shells
echo Found fish
else if grep bash /etc/shells
echo Found bash
else
echo Got nothing
end
1
2
3
4
5
6
7
8
9
10
switch (uname)
case Linux
echo Hi Tux!
case Darwin
echo Hi Hexley!
case FreeBSD NetBSD DragonFly
echo Hi Beastie!
case '*'
echo Hi, stranger!
end
1
2
3
while true
echo "Loop forever"
end
1
2
3
for file in *.txt
cp $file $file.bak
end

函数

Fish 的函数用来封装命令,或者为现有的命令起别名。

1
2
3
function ll
ls -lhG $argv
end

上面代码定义了一个 ll 函数。命令行执行这个函数以后,就可以用 ll 命令替代 ls -lhG。其中,变量 $argv 表示函数的参数。

下面是另一个例子。

1
2
3
function ls
command ls -hG $argv
end

上面的代码重新定义 ls 命令。注意,函数体内的 ls 之前,要加上 command,否则会因为无限循环而报错。

配置

Fish 的配置文件是 ~/.config/fish/config.fish,每次 Fish 启动,就会自动加载这个文件。我们可以在这个文件里面写入各种自定义函数,它们会被自动加载。

Fish 还提供 Web 界面配置该文件:

1
$ fish_config

输入上面的命令以后,浏览器就会自动打开本机的 8000 端口,用户可以在网页上对 Fish 进行配置,比如选择提示符和配色主题。按回车结束配置。

本机的 8000 端口对 Fish 进行配置


拓展阅读

给小白看的 Linux 指令

< - 完 - >
- 坚持分享 鼓励创作 -