Shell尽管 Linux 应用程序提供了 GUI,但是大部分程序员仍偏好于使用命令行(command-line interface),称为shell 。用户通常在 GUI 中启动一个 shell 窗口然后就在 shell 窗口下进行工作 。
文章插图
shell 命令行使用速度快、功能更强大、而且易于扩展、并且不会带来肢体重复性劳损(RSI) 。
下面会介绍一些最简单的 bash shell 。当 shell 启动时,它首先进行初始化,在屏幕上输出一个 提示符(prompt),通常是一个百分号或者美元符号,等待用户输入
文章插图
等用户输入一个命令后,shell 提取其中的第一个词,这里的词指的是被空格或制表符分隔开的一连串字符 。假定这个词是将要运行程序的程序名,那么就会搜索这个程序,如果找到了这个程序就会运行它 。然后 shell 会将自己挂起直到程序运行完毕,之后再尝试读入下一条指令 。shell 也是一个普通的用户程序 。它的主要功能就是读取用户的输入和显示计算的输出 。shell 命令中可以包含参数,它们作为字符串传递给所调用的程序 。比如
cp src dest
会调用 cp 应用程序并包含两个参数 src 和 dest 。这个程序会解释第一个参数是一个已经存在的文件名,然后创建一个该文件的副本,名称为 dest 。并不是所有的参数都是文件名,比如下面
head -20 file
第一个参数 -20,会告诉 head 应用程序打印文件的前 20 行,而不是默认的 10 行 。控制命令操作或者指定可选值的参数称为标志(flag),按照惯例标志应该使用 - 来表示 。这个符号是必要的,比如head 20 file
是一个完全合法的命令,它会告诉 head 程序输出文件名为 20 的文件的前 10 行,然后输出文件名为 file 文件的前 10 行 。Linux 操作系统可以接受一个或多个参数 。为了更容易的指定多个文件名,shell 支持 魔法字符(magic character),也被称为通配符(wild cards) 。比如,* 可以匹配一个或者多个可能的字符串
ls *.c
告诉 ls 列举出所有文件名以 .c 结束的文件 。如果同时存在多个文件,则会在后面进行并列 。另一个通配符是问号,负责匹配任意一个字符 。一组在中括号中的字符可以表示其中任意一个,因此
ls [abc]*
会列举出所有以 a、b 或者 c 开头的文件 。shell 应用程序不一定通过终端进行输入和输出 。shell 启动时,就会获取 标准输入、标准输出、标准错误文件进行访问的能力 。
标准输出是从键盘输入的,标准输出或者标准错误是输出到显示器的 。许多 Linux 程序默认是从标准输入进行输入并从标准输出进行输出 。比如
sort
会调用 sort 程序,会从终端读取数据(直到用户输入 ctrl-d 结束),根据字母顺序进行排序,然后将结果输出到屏幕上 。通常还可以重定向标准输入和标准输出,重定向标准输入使用 < 后面跟文件名 。标准输出可以通过一个大于号 > 进行重定向 。允许一个命令中重定向标准输入和输出 。例如命令
sort <in >out
会使 sort 从文件 in 中得到输入,并把结果输出到 out 文件中 。由于标准错误没有重定向,所以错误信息会直接打印到屏幕上 。从标准输入读入,对其进行处理并将其写入到标准输出的程序称为 过滤器 。考虑下面由三个分开的命令组成的指令
sort <in >temp;head -30 <temp;rm temp
首先会调用 sort 应用程序,从标准输入 in 中进行读取,并通过标准输出到 temp 。当程序运行完毕后,shell 会运行 head,告诉它打印前 30 行,并在标准输出(默认为终端)上打印 。最后,temp 临时文件被删除 。轻轻的,你走了,你挥一挥衣袖,不带走一片云彩 。命令行中的第一个程序通常会产生输出,在上面的例子中,产生的输出都不 temp 文件接收 。然而,Linux 还提供了一个简单的命令来做这件事,例如下面
sort <in | head -30
上面 | 称为竖线符号,它的意思是从 sort 应用程序产生的排序输出会直接作为输入显示,无需创建、使用和移除临时文件 。由管道符号连接的命令集合称为管道(pipeline) 。例如如下grep cxuan *.c | sort | head -30 | tail -5 >f00
对任意以 .t 结尾的文件中包含 cxuan 的行被写到标准输出中,然后进行排序 。这些内容中的前 30 行被 head 出来并传给 tail,它又将最后 5 行传递给 foo 。这个例子提供了一个管道将多个命令连接起来 。
推荐阅读
- .so Linux下动态库和静态库(.a) 的区别
- Linux中/etc/passwd配置文件详解
- linux后台开发中避免僵尸进程的方法总结
- 用 testdisk 恢复 Linux 上已删除的文件
- 使用 GNU bc 在 Linux Shell 中进行数学运算
- 谈谈如何学习Linux
- Redis源码剖析之SDS
- 如何获取Linux或者macOS系统版本相关信息
- linux异步IO编程实例分析
- Linux和Windows两种风格的操作系统,创建线程的方式有何不同?