3、管道符、重定向与环境变量
3.1、输入输出重定向
- 标准输入重定向(STDIN,文件描述符为0)默认从键盘输入,还可以从其他文件或命令输入
- 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕
[root@chenstudy ~]# cd /home
[root@chenstudy home]# touch linux
[root@chenstudy home]# ls -l linux
-rw-r--r--. 1 root root 0 4月 14 19:48 linux
[root@chenstudy home]# ls -l xxxxx
ls: 无法访问xxxxx: 没有那个文件或目录
[root@chenstudy home]#
# 在上述命令中,名为 linux 的文件是存在的,输出信息是该文件的一些相关权限、所有者、所属组、文件大小及修改时间等信息,这也是该命令的标准输出信息,而名为 xxxxxx的第二个文件是不存在的,因此在执行完 ls 命令之后显示的报错提示信息也是该命令的错误输出信息
- 输入重定向中用到的符号及其作用
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 < < 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件 1 > 文件 2 | 将文件 1 作为命令的标准输入并将标准输出到文件 2 |
- 输出重定向中用到的符号及其作用
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的 后面) |
对于重定向中的标准输出模式,可以省略文件描述符 1 不写 而错误输出模式的文件描述符 2 是必须要写的
# 通过标准输出重定向将 man bash 命令原本要输出到屏幕的信息写入到文件readme.txt 中,然后显示readme.txt 文件中的内容
[root@chenstudy home]# man bash > readme.txt
[root@chenstudy home]# cat readme.txt
-c string 如果有 -c 选项,那么命令将从 string 中读取。如果 string 后面有参数 (argument),它们将用于给位置参数 (positional parameter,以 $0 起始) 赋值。
-i 如果有 -i 选项,shell 将交互地执行 ( interactive )。
-l 选项使得 bash 以类似登录 shell (login shell) 的方式启动 (参见下面的 启
-r 如果有 -r 选项,shell 成为受限的 ( restricted ) (参见下面的 受
-s 如果有 -s 选项,或者如果选项处理完以后,没有参数剩余,那么命令将从标准输入读取。 这个选项允许在启动一个交互 shell 时可以设置位置参数。
-D 向标准输出打印一个以 $ 为前导的,以双引号引用的字符串列表。 这是在当前语言环境不是 C 或 POSIX 时,脚本中需要翻译的字符串。 这个选项隐含了 -n 选项;不会执行命令。
[-+]O [shopt_option]
shopt_option 是一个 shopt 内建命令可接受的选项 (参见下面的 shell 内
取消它。 如果没有给出 shopt_option,shopt 将在标准输出上打印设为允许的选项的名称和值。 如果启动选项是 +O,输出将以一种可以重用为输入的格式显示。
-- -- 标志选项的结束,禁止其余的选项处理。任何 -- 之后的参数将作为文件名和参数对待。参数 - 与此等价。
Bash 也解释一些多字节的选项。在命令行中,这些选项必须置于需要被识别的单字符参数之前。
--dump-po-strings
等价于 -D,但是输出是 GNU gettext po (可移植对象) 文件格式
--dump-strings
等价于 -D
--help 在标准输出显示用法信息并成功退出
--init-file file
重写readme.txt文件,并写入:Wlecome to XYNU,然后再追加Hello 22
[root@chenstudy home]# echo "Wlecome to XYNU" > readme.txt
[root@chenstudy home]# echo "Hello 22" >> readme.txt
[root@chenstudy home]# cat readme.txt
Wlecome to XYNU
Hello 22
对于输处重定向技术,不同命令的标准输出和错误输出还是有区别的
对于真实存在的文件,使用标准输出即将原本输出到屏幕的信息写入到文件中,而错误的输出重定向则依然把信息输出到屏幕上
[root@chenstudy home]# ls -l linux
-rw-r--r--. 1 root root 0 4月 14 19:48 linux
[root@chenstudy home]# ls -l linux > /root/stderr.txt
[root@chenstudy home]# ls -l linux 2> /root/stderr.txt
-rw-r--r--. 1 root root 0 4月 14 19:48 linux
[root@chenstudy home]#
如何把错误信息写入到文件中呢?
[root@chenstudy home]# ls -l xxxx
ls: 无法访问xxxx: 没有那个文件或目录
[root@chenstudy home]# ls -l xxxx > /root/stderr.txt
ls: 无法访问xxxx: 没有那个文件或目录
[root@chenstudy home]# ls -l xxxx 2> /root/stderr.txt
[root@chenstudy home]# cat /root/stderr.txt
ls: 无法访问xxxx: 没有那个文件或目录
[root@chenstudy home]#
3.2、 管道命令符
执行格式为“命令 A | 命令 B”
# 找出被限制登录用户的命令是 grep "/sbin/nologin" /etc/passwd;
# 统计文本行数的命令则是 wc -l
[root@chenstudy home]# grep "/sbin/nologin" /etc/passwd | wc -l
39
[root@chenstudy home]#
# 查看/etc 目录中的文件列表及属性信息
[root@chenstudy home]# ls -l /etc/ | more
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成 第3章 管道符、重定向与环境变量 64 为一个非常致命的缺陷。通过把管道符和 passwd 命令的--stdin 参数相结合,我们可以用一条 命令来完成密码重置操作:
[root@chenstudy home]# echo "root" | passwd --stdin root
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@chenstudy home]#
管道符命令可以组合使用多个命令A | 命令B | 命令C
3.3、命令行统配符
我们有时候也会遇到明明一 个文件的名称就在嘴边但就是想不起来的情况批量查看所有硬 盘文件的相关权限属性,一种方式是这样的:
[root@chenstudy home]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 4月 14 19:40 /dev/sda
[root@chenstudy home]# ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 4月 14 19:40 /dev/sda1
#通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配 0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符
# 比如星号(*)代表匹配零个或多个字符
[root@chenstudy home]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 4月 14 19:40 /dev/sda
brw-rw----. 1 root disk 8, 1 4月 14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 2 4月 14 19:40 /dev/sda2
brw-rw----. 1 root disk 8, 3 4月 14 19:40 /dev/sda3
# 只想查看文件名为 sda 开头,但是后面还紧跟其他某一个字符的文件的相关信息就需要用到问号来进行通配了
[root@chenstudy home]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 4月 14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 2 4月 14 19:40 /dev/sda2
brw-rw----. 1 root disk 8, 3 4月 14 19:40 /dev/sda3
# 匹配任意的数字0-9
[root@chenstudy home]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 4月 14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 2 4月 14 19:40 /dev/sda2
brw-rw----. 1 root disk 8, 3 4月 14 19:40 /dev/sda3
[root@chenstudy home]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 4月 14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 3 4月 14 19:40 /dev/sda3
### 3.4、 常用的转义字符
常用的转义字符:为了能够更好地理解用户的表达,Shell 解释器还提供了特别丰富的转义字符来处理输入 的特殊数据
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
- 双引号(""):保留其中的变量属性,不进行转义处理
- 反引号(``):把其中的命令执行后返回结果
#先定义一个名为 PRICE 的变量并赋值为 5,然后输出以双引号括起来的字符串与变量信息:
[root@chenstudy ~]# PRICE=5
[root@chenstudy ~]# echo "PRICE IS $PRICE"
PRICE IS 5
# 输出“Price is $5”
[root@chenstudy ~]# echo "PRICE IS \$$PRICE"
PRICE IS $5
# 反引号与 uname -a 命令结合,然后使用 echo 命令来查看本机的 Linux版本和内核信息:
[root@chenstudy ~]# echo `uname -a`
Linux chenstudy 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
3.5、重要的环境变量
- 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话 则直接执行
Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令 名称来替换原本的命令名称
- 用 alias 命令来创建一个属于自己的命令别名,格式为 “alias 别名=命令”
- 要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”
[root@chenstudy ~]# ls
anaconda-ks.cfg ch initial-setup-ks.cfg stderr.txt 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@chenstudy ~]# rm anaconda-ks.cfg
rm:是否删除普通文件 "anaconda-ks.cfg"?y
[root@chenstudy ~]# alias rm
alias rm='rm -i'
[root@chenstudy ~]# unalias rm
[root@chenstudy ~]# rm initial-setup-ks.cfg
[root@chenstudy ~]#
- Bash 解释器判断用户输入的是内部命令还是外部命令 ,可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令
- 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可 以简单地把它理解是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存放 的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找
[root@chenstudy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@chenstudy ~]# PATH=$PATH:/root/bin
[root@chenstudy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
[root@chenstudy ~]#
- Linux 系统中最重要的 10 个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
[root@chenstudy ~]# echo $HOME
/root
[root@chenstudy ~]# su - chen
上一次登录:二 4月 12 22:16:24 CST 2022:0 上
[chen@chenstudy ~]$ echo $HOME
/home/chen
# 变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量,来满足工作需求
[root@chenstudy ~]# mkdir /home/workdir
[root@chenstudy ~]# WORKDIR=/home/workdir
[root@chenstudy ~]# cd $WORKDIR
[root@chenstudy workdir]# pwd
/home/workdir
[root@chenstudy workdir]#
# 上述方式的变量不具有全局性,工作需要时可以使用export命令将其提升为全局变量
[root@chenstudy workdir]# su - chen
上一次登录:四 4月 14 23:02:17 CST 2022pts/2 上
[chen@chenstudy ~]$ cd $WORKDIR
[chen@chenstudy ~]$ echo $WORKDIR
[chen@chenstudy ~]$ exit
登出
[root@chenstudy workdir]# su - root
上一次登录:四 4月 14 23:03:02 CST 2022pts/2 上
[root@chenstudy ~]# export WORKDIR
[root@chenstudy ~]# cd /home/workdir/
[root@chenstudy workdir]# su - chen
上一次登录:四 4月 14 23:06:08 CST 2022pts/2 上