3、管道符、重定向与环境变量 3.1、输入输出重定向 标准输入重定向(STDIN,文件描述符为0)默认从键盘输入,还可以从其他文件或命令输入 标准输出重定向(STDOUT,文件描述符为1):默认输
3、管道符、重定向与环境变量
3.1、输入输出重定向
- 标准输入重定向(STDIN,文件描述符为0)默认从键盘输入,还可以从其他文件或命令输入
- 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕
- 输入重定向中用到的符号及其作用
- 输出重定向中用到的符号及其作用
对于重定向中的标准输出模式,可以省略文件描述符 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/sda33.4、 常用的转义字符
常用的转义字符:为了能够更好地理解用户的表达,Shell 解释器还提供了特别丰富的转义字符来处理输入 的特殊数据
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
- 双引号(""):保留其中的变量属性,不进行转义处理
- 反引号(``):把其中的命令执行后返回结果
3.5、重要的环境变量
- 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话 则直接执行
- Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令 名称来替换原本的命令名称
- 用 alias 命令来创建一个属于自己的命令别名,格式为 “alias 别名=命令”
- 要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”
- Bash 解释器判断用户输入的是内部命令还是外部命令 ,可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令
- 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可 以简单地把它理解是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存放 的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找
- Linux 系统中最重要的 10 个环境变量