0x03-0 RHEL linux 管道符、重定向与环境变量
在之前已经学了很多基础的命令,如果加上管道符可以提升工作效率。
5种模式
标准覆盖输出重定向
标准追加输出重定向
错误覆盖输出重定向
错误追加输出重定向
输入重定向
输入重定向中用到的符号其作用
| 符号 | 作用 |
| 命令 < 文件 | 将文件作为命令的标准输入 |
| 命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
| 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输出重定向中用到的符号及其作用
| 符号 | 作用 |
| 命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
| 命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
| 命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
| 命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
| 命令 >> 文件 2>&1 或 命令 &>> 文件 |
将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。我们先来小试牛刀。通过标准输出重定向将man bash命令原本要输出到屏幕的信息写入到文件readme.txt中,然后显示readme.txt文件中的内容。具体命令如下:
[root@pantao ~]# man bash >readme.txt [root@pantao ~]# cat readme.txt
我们使用帮助命令对bash进行打印 这里使用一个重定向 把他输出到readme.txt这个文件中
或者你还可以直接把自己想写的东西直接输出到你想要输入的文件中例如:
[root@pantao ~]# echo "welcome to linux" > twly.txt [root@pantao ~]# cat twly.txt welcome to linux
如果要在后面追加内容的话需要>>
[root@pantao ~]# echo "Welcome to xxxxxx" >>twly.txt [root@pantao ~]# cat twly.txt welcome to linux Welcome to xxxxxx
当我们重定向时候,如果没有目标文件则需要使用 命令 2> 文件
[root@pantao ~]# ls -l aaaa 2>1.txt [root@pantao ~]# cat 1.txt ls: cannot access aaaa: No such file or directory
输入重定向相对来说有些冷门,在工作中遇到的概率会小一点。输入重定向的作用是把文件直接导入到命令中。接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数。
[root@pantao ~]# wc -l < readme.txt 5461
对于重定向,>个人就会想起来装油的哪种漏斗
,输出来的时候,把数据往一个容器里面装(目标文件).
管道命令符
把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入。
例如,我们可以grep搜索命令,通过关键词/sbin/nologin找出所有被限制登录的系统用户。然后在用wc -l命令来统计被禁止登陆的用户。
找出被限制登录用户的命令是grep "/sbin/nologin" /etc/passwd;
统计文本行数的命令则是wc -l。

现在就是需要把grep 搜索出来的值通过管道符传递给wc命令,具体如下
[root@pantao ~]# grep "/sbin/nologin" /etc/passwd | wc -l 23
如果你前一个命令输出到屏幕上觉得太多的话,可以配合管道符来使用:
[root@pantao ~]# ifconfig | more
br-3dcf3f4efbdd: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:a7:84:e4:61 txqueuelen 0 (Ethernet)
RX packets 3445 bytes 279116 (272.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3445 bytes 279116 (272.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collision。。。。。。
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过把管道符和passwd命令的--stdin参数相结合,我们可以用一条命令来完成密码重置操作:
[root@pantao ~]# echo "linuxprobe" | passwd --stdin root
--stdin 专门用于接收管道符的一个命令
命令行的通配符
我们有时候也会遇到明明一个文件的名称就在嘴边但就是想不起来的情况。如果就记得一个文件的开头几个字母,想遍历查找出所有以这个关键词开头的文件,该怎么操作呢?我们可以使用通配符查找
[root@linuxprobe ~]# ls -l /dev/sda brw-rw----. 1 root disk 8, 0 May 4 15:55 /dev/sda [root@linuxprobe ~]# ls -l /dev/sda1 brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1 [root@linuxprobe ~]# ls -l /dev/sda2 brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2 [root@linuxprobe ~]# ls -l /dev/sda3 ls: cannot access /dev/sda3: No such file or directory
| ls -l /dev/sda* | 通配下面所有在/dev目录下且是sda开头的文件 | /dev/sda,/dev/sda1,/dev/sdaaa |
| ls -l /dev/sda? | 只匹配紧跟其后某一个字符 | /dev/sda1,/dev/sda5... |
| ls -l /dev/sda[0-9] | 匹配0-9单个数字 | /dev/sda0-9之间的 |
常用的转义字符
4个最常用的转义字符如下所示。
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(''):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
我们先定义一个PRICE的变量值为5,然后输出以双引号括起来的字符串与变量。
[root@pantao ~]# PRICE=5 [root@pantao ~]# echo "Price is $PRICE" Price is 5
那么如果我们要输入的是5美元呢?这里就需要转义啦
[root@pantao ~]# echo "Price is \$$PRICE" Price is $5
而如果只需要某个命令的输出值时,可以像`命令`这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与uname -a命令结合,然后使用echo命令来查看本机的Linux版本和内核信息:
[root@pantao ~]# echo `uname -a` Linux pantao 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
haha=`uptim`
echo $haha
重要的环境变量
1:路径|命令
2:别名alias
别名创建 alias uu=“uname -a”
uu使用该命令相当于使用之前赋值的命令。
unalias uu 取消别名
3:内部命令
4:外部命令linux系统一切都是文件,命令文件,PATH
Linux系统中最重要的10个环境变量
| 变量名称 | 作用 |
| HOME | 用户的主目录(即家目录) |
| SHELL | 用户在使用的Shell解释器名称 |
| HISTSIZE | 输出的历史命令记录条数 |
| HISTFILESIZE | 保存的历史命令记录条数 |
| 邮件保存路径 | |
| LANG | 系统语言、语系名称 |
| RANDOM | 生成一个随机数字 |
| PS1 | Bash解释器的提示符 |
| PATH | 定义解释器搜索用户执行命令的路径 |
| EDITOR | 用户默认的文本编辑器 |
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。
例如,我们使用下述命令来查看HOME变量在不同用户身份下都有哪些值(su是用于切换用户身份的命令):
[root@linuxprobe ~]# echo $HOME /root [root@linuxprobe ~]# su - linuxprobe Last login: Fri Feb 27 19:49:57 CST 2017 on pts/0 [linuxprobe@linuxprobe ~]$ echo $HOME /home/linuxprobe
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量,来满足工作需求。例如设置一个名称为WORKDIR的变量,
方便用户更轻松地进入一个层次较深的目录:
[root@linuxprobe ~]# mkdir /home/workdir [root@linuxprobe ~]# WORKDIR=/home/workdir [root@linuxprobe ~]# cd $WORKDIR [root@linuxprobe workdir]# pwd /home/workdir
但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用export命令将其提升为全局变量,这样其他用户也就可以使用它了:
[root@linuxprobe workdir]# su linuxprobe
Last login: Fri Mar 20 20:52:10 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd $WORKDIR
[linuxprobe@linuxprobe ~]$ echo $WORKDIR
[linuxprobe@linuxprobe ~]$ exit
[root@linuxprobe ~]# export WORKDIR
[root@linuxprobe ~]# su linuxprobe
Last login: Fri Mar 20 21:52:10 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd $WORKDIR
[linuxprobe@linuxprobe workdir]$ pwd
/home/workdir

浙公网安备 33010602011771号