第二章:管道符,重定向与环境变量
为了配合Linux中常用的命令,我们还需要掌握管道符,重定向和环境变量等相关内容.
学习了这些内容,我们就能够对各种不同的命令进行组合使用,极大地提升我们的工作效率
本章首先讲解与文件的读写操作有关的重定向技术的五种模式:标准覆盖输出重定向,标准追加输出重定向,错误覆盖输出重定向,错误追加输出重定向和输入重定向.最终解决我们在命令行模式下的输出信息的保存问题
然后再讲解管道符命令,已掌握各种命令之间的搭配方法,进一步提高输出值的处理效率.
接下来讲解Linux系统命令行中的通配符和常见转义字符,来让输入的命令具有更加准确的意义.
最后讲解Bash解释器执行Linux命令的工作原理,进而为讲解PATH变量和Linux中的重要环境变量做好基础
本章主要包含内容:
- 输入输出重定向
- 管道符命令
- 命令行的通配符
- 常用的转义字符
- 重要的环境变量
输入输出重定向
上一章几乎讲解完了所有常用的Linux命令,我们会发现很多时候执行命令的输出都是打印在命令行中的,并不会储存在外面的某个文件中,换而言之终端中的输出并不会对终端外的世界产生影响.而有的时候我们又需要将这些输出储存到文件中,以便我们后续能够查看,那么这个时候就需要使用输入和输出重定向的知识.
输出重定向就是把原本要输出到屏幕上的内容输出到指定的文件中,即重定向输出目标
输入重定向是指把原本要通过键盘输入的命令由指定文件输入,即重定向输入来源
一般来说我们使用输出重定向较多,但是输入重定向也会用到.
下面就将分别讲解
输出重定向
输出重定向又分为标准输出重定向和错误输出重定向,根据输出的模式不同,又分为覆盖写入和追加写入两种
标准输出重定向是指命令正确输出时候,将正确的输出结果重定向到文件中
错误输出重定向是指当命令执行发生错误的时候,将错误信息重定向到文件中
例如:
[root@Jack-linuxprobe Desktop]# ls -l profile
-rw-r--r--. 1 root root 1750 Jun 28 09:30 profile
[root@Jack-linuxprobe Desktop]# ls -l xxxxxx
ls: cannot access xxxxxx: No such file or directory
第二个就是由于不存在这个文件导致的错误
这个时候如果使用了错误输出重定向,报错信息就会被存放到一个文件中
与之相对应,标准输出重定向就是把正确的输出重定向到文件中
如果使用了标准输出重定向但是却报错,那么文件中不会有任何内容,并且报错内容会同样打印到屏幕上.同理正确输出内容如果使用错误输出重定向那么也会打印在屏幕上
输出重定向符号及用法:
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中 覆盖掉原有内容 |
命令 2> 文件 | 将错误输出重定向到一个文件中 覆盖掉原有内容 |
命令 >> 文件 | 将标准输出重定向到一个文件中 追加到原有内容后 |
命令 2>> 文件 | 将错误输出重定向到一个文件中 追加到原有内容后 |
命令 >> 文件 2> %1 或 命令 &>> 文件 | 将标准输出与错误输出同时重定向到一个文件中 追加到原有内容后 |
另外多提一句,标准输出重定向符号其实是1>,但是1可以省略不写.但是错误输出重定向符号的2必须写
输入重定向
输入重定向一般用于将文件内容作为命令操作的对象.
例如需要在下载多个网上的pdf内容,这个时候需要在wget后面接多个网址,容易出错.这个时候可以把这些网址放到一个文件中.然后将该文件作为wget的输出
输出重定向符号和作用如下:
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2中 |
不过学习了后面管道符相关内容之后,很多输入重定向都能用管道符来代替.
需要多说的是分界符的内容.使用分界符,按下回车之后会进入一个交互模式,类似于Vim编辑器.在需要的输入结束之后,另起一行输出分界符,则停止输入,例如:
[jwang@JackWang Destop]$ cat << EOF
>这是一个示例 第一行
>这是一个示例 第二行
>EOF
这是一个示例 第一行
这是一个示例 第二行
[jwang@JackWang Desktop]$
在上面的例子中,EOF是分界符,第一个EOF输入之后按下回车就到了第二行有==>==提示输入.最后结束输入之前另起一行输入EOF再回车
管道命令符
管道命令符的作用就是将多个语句结合在一起使用,这样的话就能够让我们的效率极大地提升
语法:
命令A | 命令B
作用是:将前一个命令的标准输出当做后一个命令的标准输入
例如:
使用wc命令统计readme.txt文件有多少行
cat read.me | wc -l
如果用输入重定向的话就是
wc -l < readme.txt
管道符神通广大,还有很多有用的技巧.
例如:
-
查看具有多个内容的目录,如果用ls命令的话就会直接全部输出(中间不带停顿),这个时候就可以和more命令结合,这样就能以翻页的形式查看,还能看到剩余百分比
ls -l /etc/ | more
上面的命令就用more的形式查看/etc目录下的文件
-
有的时候需要用户输入两次内容来确认操作,例如改密码.因此我们可以用echo来提取变量,然后配合passwd命令
echo "newpassword" | passwd --stdin root
echo将字符串提取出来,输出到屏幕上,然后管道符将输出作为passwd命令的输入
-
管道符可以多次使用
|命令A|命令B|命令C
命令行的通配符
有的时候如果我们忘记了一个文件或者命令的全称,那么就可以通过通配符来遍历打印(称为匹配)所有以这个关键字开头的文件
通配符和作用如下:
通配符 | 作用 |
---|---|
* | 匹配零个或多个字符 |
? | 匹配单个字符 |
其中:
-
在*后面加上==[]==,括号里加入数字表示匹配的指定数字,范围0-9.加入字母表示匹配指定字母,范围a-z,A-Z
-
在*后面加上==[]==,括号内放多个数字或字母表示匹配任意一个字母或数字
例如:ls -l /dev/sda* ls -l /dev/sda[2] ls -l /dev/sda[a]
常用的转义字符
转义符的出现是为了我们能够更好地处理输入的特殊数据.例如有的时候我们的一些文本符号会和Linux中具有特定功能的一些符号重叠,因此原本我们只是想要输出一个文本符号,结果却执行了Linux中的一些脚本
除此以外,转义字符还有很多的功能,这里只将介绍常用的四个转义字符:
符号 | 作用 |
---|---|
反斜杠 \ | 使反斜杠后面的一个变量变成单独的字符串 |
单引号’ ’ | 转义其中所有的变量作为单纯的字符串 |
双引号" " | 保留其中的变量属性,不进行转义处理 |
反引号` ` | 把其中的命令执行后返回为结果 |
例如:
PRICE=5
$PRICE
>>>5
上面的例子就是命令了变量PRICE,让其值等于5.而后用$来提取变量的值
那么如果我们想要输出就会有点问题
echo "Price is $$PRICE"
由于$$这个转义字符的作用是显示当前进程ID号码,因此就不会输出5.
所以我们需要使用反斜杠==\==,来让第一个$变成普通文本
重要的环境变量
变量是计算机系统中用于保存值可变的数据类型
在Linux中,变量名称一般都是大写的,这是一种约定俗称的规范.我们可以直接用变量名称来提取到对应的变量值.
Linux中环境变量是用来定义系统运行环境的一些参数,例如我们在执行命令的时候这些环境变量中的参数告诉系统在那里去寻找这些命令,邮件的存放位置,每个用户的家目录,运行一个程序时在那里寻找调用的库等等
事实上,为了Linux系统的正常运行,需要有数百个环境变量来协同工作.但是我们没有必要全部学习.只需学习几个重要的即可.
那么下面我们就将结合Linux系统运行命令的时候,发生的事情来讲解环境变量
我们执行命令的时候,命令在Linux中执行分成四个步骤:
-
判断用户是按照相对路径还是绝对路径的方式来输入命令,如果是用路径的方式来输入命令的话,那么直接按照路径去找到命令,然后执行,例如:
/usr/bin/cd
-
检查用户的输入是否为==“别名命令”,就是用一个用户自定义的名称来代替原有命令.
例如我么平时用的所有的命令.
我们可以用alias命令来完成设置别名,用unalias==来移除别名.
语法:alias 别名=命令 unalias 别名
例如:
有的Linux发行版使用rm删除文件的时候需要输入yes来确认,因此我们可以为rm -l命令来设置一个别名alias rm='rm -l' //注意''表示将内容视为纯文本 unalias rm
-
Bash解释器判断用户输入的是内部命令还是外部命令.
如果是解释器内部的指令,直接执行;如果是外部命令,则转移到第四步
内部指令是解释器自带的命令,安装好解释器之后就有.外部命令是其他人编写的命令.
由于有的外部命令真的很好用,因此Linux中就讲这0-些外部命令集成了内部命令是指shell 自带的;在系统启动时就调入内存,并常驻内存,所以执行效率高
外部命令不是Shell自带的,可能由第三方作者编写,是 Linux 的实用程序部分,在文件系统下有对应的路径;实用程序功能强大,且程序量也会很大,因此在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其从硬盘中调用内存。
通常外部命令的实体并不包含在 shell 中,只是其命令执行过程是由 shell 程序控制。判断一个命令是不是外部命令只需要用type命令
type 命令名称
例如
[root@Jack-linuxprobe Desktop]# type cd cd is a shell builtin [root@Jack-linuxprobe Desktop]# type cat cat is /usr/bin/cat
其中cd命令是内部命令,cat命令是外部命令
此外,我们执行以下命令
[root@Jack-linuxprobe Desktop]# type [ [ is a shell builtin
可以发现,符号
[
并不仅仅是单纯的符号,而是一个命令的名称,实际上[
是shell的正则表达式的一部分,关于正则表达式可以看我的正则表达式专栏 -
系统在多个路径中查找用户输入的命令的文件,而这些路径都是由环境变量所储存的.这些路径叫PATH,他告诉Bash解释器待执行的命令可能存放的位置.然后Bash解释器就会在这些位置中遍历查找.
PATH是由多个键值对构成的变量,每个键值对之间用冒号间隔.每个键值对的增加和删除都会影响Bash解释器对命令的查找
PATH是一个变量,可以用echo命令配合$提取变量输出echo $PATH
需要查看环境变量,我们可以用env命令
语法:
env
下面我们将列举一些重要的环境变量,里面储存着一些很关键的信息
变量名称 | 作用 |
---|---|
HOME | 储存当前用户的主目录 |
SHELL | 用户当前使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统的语言,语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
用户名默认的文本编辑器 |
Linux是一个多用户系统,因此能够为每个用户提供独立的,合适的工作运行环境.
因此对于每一个用户,都会有自己的家目录.因此我们使用不同身份的用户查看HOME变量具有不同的值
事实上,我们也可以自己定义变量,然后使用
例如:
每次切换到某个文件夹,都会比较麻烦,那么我们可以设置一个变量
mkdir Desktop/LinuxLeaning/Try
WORKDIR=Desktop/LinuxLearning/Try
cd $WORKDIR
不过这样添加的变量只能有当前用户使用,我们可以用export命令来将变量提升为全局变量
export WORKDIR