8 shell 用法简介

通过阅读本章,你将会了解到以下几项内容。

  • 了解 Linux Shell
  • 打开 Shell 终端的方法
  • Bash 语法简介
  • Bash 自动补全和输入历史
  • 命令的拼接和拓展
  • 变量和简写
  • 如何使用理解帮助文档

作为普通人,使用电脑除了窗口图形界面外,还有个叫终端的字符界面。Linux 中通过在终端敲击字符跟电脑交互,这玩意就叫做 shell,并且相比图形界面(Graphic User Interfaces, GUI),通常 shell 功能更加强大。

深度系统默认采用的 shell是 bash(Bourne Again Shell),继承兼容于 UNIX 早期的 Bourne shell (作者:Stephen Bourne, 命令名为 sh),当然两者还是有那么一点点不同的。曾经有一段时间深度默认 shell 是 zsh,经群众投票又改回 bash了,其实那次投票是我发起的。

除此之外,类 UNIX 系统还有其他的一些 shell,比如 ksh,csh,tcshash,当然还有非常好用的 zsh 等,有兴趣的可以查相关资料。

8.1 用 shell 有啥好处?

为了装吗?不见得。

刚接触 Linux 桌面发行版的时候,按着教材说的,就在学习终端哦。遇到糟糕的 Linux 图形界面卡住了、死机啦,不得不网上搜索解决方案,能不用终端 shell 吗?作为小白,遇到各种各样的问题,查询询问的结果,大神的建议,也多半是在 shell 下解决啊,这叫不得不用。

后来慢慢脱离低级小白,开始喜欢上终端远程连接其他 Linux 电脑,享受这种快捷方便的操作。再后来终端下用 vim 写代码,键盘翻飞,似乎成为了一种享受。

再后来,开始接管一些服务器,开始学习计算机安全知识,似乎更离不开了 shell 了。似乎儿时那种黑客的感觉,只有通过 shell 才可以实现哦。

其实 Windows 下也有 DOS 和 CMD 这类字符操作界面,不过功能弱爆了, powershell 可能功能强大一些,有兴趣的可以查相关资料,这里不说了。

8.2 深度操作系统下 shell 简介

按照《Linux Bible》的说法,有三种方式打开 shell 操作界面,分别叫shell提示符(shell prompt),终端窗口(Terminal window),和虚拟控制台(virtual console)。我感觉深度操作系统就后面两种,第一种说是登录的时候出现的那种字符界面,不太容易遇到,暂且跳过。

深度操作系统登录后,进入桌面,按下 Ctrl + Alt + T (或F4Alt + F2打开终端雷神模式,这个版本不同有所变化)会弹出深度终端窗口,这个软件在第三章已经作了介绍。可用于 shell 练习。对于虚拟控制台,可以通过按下 Ctrl + Alt + Fi 其中 Fi 表示 F1,F2,...,F6,分别弹出六个虚拟控制台,对于不同的电脑,可能Ctrl + Alt + F1 或者Ctrl + Alt + F7 打开的是图形界面(GUI)。

下面以深度终端窗口为例来说明。

打开深度终端的方式

  • 快捷键的方式:按下 Ctrl + Alt + T 或者 F4Alt + F2,弹出深度终端。
  • 图形方式:按下 super 键,或者点击左下角的图标,会弹出已安装软件图标,找到深度终端的图标,点击即可。或者在最上面搜索框中搜索终端。
  • 鼠标右键:在桌面上,右击选择在终端中打开,也可以进入深度终端。

打开终端后,右击窗口内部,选择设置,可以对终端的一些外观属性配置。

深度终端的显示说明

在每行命令行开头会如下显示,

litianci@litianci-pc:~$ 

解释

  1. litianci@litianci-pc:~ 表示用户名和电脑名,并用@隔开,:后是当前工作目录是主目录的意思,因为古老的键盘中Home是同一个按键,所以就用 ~代替主目录了。
  2. $ 默认表示普通用户, # 默认表示 root 根用户。
  3. 这个显示说明是可以修改的,见后文 @ref() 小节。
  4. $ 或者 # 后输入相关的命令字符。

$ 表示正在用普通用户权限运行后面的命令,而 # 则表示正在使用 root 根用户的权限。通常只有涉及重大核心系统功能的地方才需要用到root根用户权限。根据放权的最小权限原则,在普通用户权限可做的事情,建议不要使用 root 根用户权限。

8.2.1 牛刀小试

下面命令行首标志 $# 区分运行权限,其他显示信息略。输入结果行没有行首标志,每行会有序号方便区分。

$ whoami
litianci
$ who -H
名称   线路       时间           备注
litianci tty1         2018-09-20 09:07 (:0)
$ grep litianci /etc/passwd
litianci:x:1000:1000::/home/litianci:/bin/bash

解释

  1. whoami 列出当前用户名
  2. who -H 列出信息更详细,-H 表示显示头部标题列,第二行显示当前登录用户名litianci,当前登录线路终端tty1,当前用户登录系统时间2018-09-20 09:07,以及备注(:0)该备注啥意思暂时没有找到,是不是图形界面的意思,待后续找资料。
  3. 第6行,是在/etc/passwd文件内查找该用户,在第7行最后/bin/bash,表示该用户默认的shell类型。实际操作时请把litianci换成你的账户名。
$ date
2018年 09月 21日 星期五 16:45:08 CST
$ pwd
/home/litianci
$ hostname
litianci-PC
$ hostname -I
192.168.43.45
$ ls
Desktop  Documents  Downloads  Music  Pictures  Videos

解释

  1. date 命令,无选项无参数时,输出当前日期、星期、时间和时区。其中CST表示中国标准时区,也即东八区。不过CST这个简写有歧义,代表如下几个时区,
    • CST Central Standard Time (USA) UT-6:00
    • CST Central Standard Time (Australia) UT 9:30
    • CST China Standard Time UT 8:00
    • CST Cuba Standard Time UT-4:00
  2. pwd 命令输出当前工作目录。
  3. hostname 命令,无选项无参数时输出本机名称,如果加选项-I,则输出本机IP地址。
  4. ls 命令列出当前目录下所有的可见文件及文件夹。

8.2.2 命令语法结构

为了丰富命令的功能,命令常常带多种选项及参数的,这里区分两个名称,

  • 选项(Options):是调整命令执行行为的开关,即,选项不同决定了命令的显示结果不同;
  • 参数(Arguments):是指命令的作用对象。

8.2.3 选项(Options)

选项分为长选项和短选项。下面示例中,-l -a -t就是短选项,

$ ls -l -a -t
$ ls -lat

解释

  1. -l(long listing),宽列,较长格式列出信息,-a(all)列出所有文件(夹),包括隐藏文件(夹),-t(time)按时间排序。
  2. 短选项一般使用-短横线引导。也有不带-的,比如ps aux,这类叫BSD风格的选项。
  3. 当有多个短选项时,各选项之间使用空格隔开。
  4. 有些短选项可以组合,比如 -l -a -t 可以组合为-lat
  5. 有些短选项需带参数,比如-L 512M,则不便跟其他短选项组合,但如果位于最后一个也是可以组合的。比如tar cvf deepin-bible.tar ~/deepin-bible,各选项说明见后面8.2.5节解释。
$ ls --hide=Desktop
Documents  Downloads  Music  Pictures  Videos