第三章 管道符、重定向与环境变量
- 重定向:命令与文件之间
- 管道符:命令与命令之间
3.1 输入输出重定向
输入重定向:指把文件导入到命令中; (同
inputStream
理解)
输出重定向:指把原本要输出到屏幕的数据信息写入到制订文件中;(同outputStream
理解)
标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
输入重定向
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入(参数) |
命令 << 分界符 | 从标准输入中读入,直到遇到分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入,并将标准输出写到文件2 |
输出重定向
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到文件中(清空原文件) |
命令 >> 文件 | 将标准输出重定向到文件中(追加输出) |
命令 2> 文件 | 将错误输出重定向到文件中(清空原文件) |
命令 2>> 文件 | 将错误输出重定向到文件中(追加输出) |
命令 &> 文件 | 将标准输出和错误输出都重定向到文件中(清空原文件) |
命令 &>> 文件 | 将标准输出和错误输出都重定向到文件中(追加输出) |
- 示例:
[root@localhost ~]$ wc -l < initial-setup-ks.cfg
49
[root@localhost ~]$ wc -l initial-setup-ks.cfg >> a.txt
3.2 管道命令符
管道命令符:将前面命令原先要输出到屏幕上的内容,交由后面的命令二次处理(任意门);
管道命令符可以多嵌套使用
[root@localhost ~]$ ls -l /etc/ | more # 使用more命令来浏览文件列表
total 1344
-rw-r--r--. 1 root root 16 Jan 9 01:00 adjtime
-rw-r--r--. 1 root root 1518 Sep 10 2018 aliases
drwxr-xr-x. 3 root root 65 Jan 9 00:55 alsa
drwxr-xr-x. 2 root root 4096 Jan 9 00:58 alternatives
-rw-r--r--. 1 root root 541 Oct 2 2018 anacrontab
...
#通过把管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置操作
[root@linuxprobe ~]$ echo "linuxprobe" | passwd --stdin root # --stdin参数专门用来接收标准输入
Changing password for user root.
passwd: all authentication tokens updated successfully.
3.3 命令行的通配符
通配符 | 含义 |
---|---|
* | 空值或任意字符 |
? | 单个任意字符 |
[a-z] | 单个小写字母 |
[A-Z] | 单个大写字母 |
[a-Z] | 单个字母 |
[0-9] | 单个数字 |
[:alpha:] | 任意字母 |
[:upper:] | 任意大写字母 |
[:lower:] | 任意小写字母 |
[:digit:] | 所有数字 |
[:alnum:] | 任意字母加数字 |
[:punct:] | 标点符号 |
使用范例及注意:
[root@localhost ~]$ ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Jan 15 07:38 /dev/sda
brw-rw----. 1 root disk 8, 1 Jan 15 07:38 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jan 15 07:38 /dev/sda2
[root@localhost ~]$ ll /dev/sd[:alpha:]
brw-rw----. 1 root disk 8, 0 Jan 15 07:38 /dev/sda
[root@localhost ~]$ ll /dev/s[a-Z][a-Z][0-9] # 可以多个连接使用
brw-rw----. 1 root disk 8, 1 Jan 15 07:38 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jan 15 07:38 /dev/sda2
[root@localhost ~]$ ls -l /dev/sda{1,2,3} # 大括号范围内的若不存在则会报错
ls: cannot access '/dev/sda3': No such file or directory # sda3不存在,报错提示
brw-rw----. 1 root disk 8, 1 Jan 15 07:38 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jan 15 07:38 /dev/sda2
[root@localhost ~]$ ls -l /dev/sda[1,2,3] # 中括号范围内若不存在不会报错
brw-rw----. 1 root disk 8, 1 Jan 15 07:38 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jan 15 07:38 /dev/sda2
3.4 常用转义字符
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符。
单引号(’’):转义其中所有的变量为单纯的字符串。(全局转义)
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
[root@localhost ~]$ echo PRICE
PRICE
[root@localhost ~]$ PRICE=5
[root@localhost ~]$ echo "price is $PRICE"
price is 5
[root@localhost ~]$ echo 'price is $PRICE'
price is $PRICE
[root@localhost ~]$ echo "price is $$PRICE" # $$的作用是显示当前程序的进程ID号码
price is 2569PRICE
[root@localhost ~]$ echo "price is \$$PRICE"
price is $5
[root@localhost ~]$ echo `uptime`
08:07:28 up 28 min, 1 user, load average: 0.08, 0.05, 0.06
3.5 重要的环境变量
变量名称一般都是大写的,这是一种约定俗称的规定;变量可以是值、路径等等
变量的修改立即生效,但重启后会重置,要修改/etc/profile
才能永久生效;
变量不具有全局性,默认情况下不能被其他用户使用,可以使用export
命令提升其为全局变量
解释器执行命令的步骤:
- 1.判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行;
- 2.Linux系统检查用户输入的命令是否为“别名命令”;(启用、解除别名见下)
- 3.Bash解释器判断用户输入的是内部命令(少于1%)还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令(99%),这些命令交由步骤4继续处理。可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令:
- 4.系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
# 设置与取消别名
[root@localhost ~]$ alias ll # 查看ll是什么的别名
alias ll='ls -l --color=auto'
[root@localhost ~]$ unalias ll # 取消ll别名
[root@localhost ~]$ alias lx=ls # 给ls取别名 lx
# 查看命令所属
[root@localhost ~]$ type echo
echo is a shell builtin # 内部命令
[root@localhost ~]$ type ls
ls is aliased to `ls --color=auto' # 别名
[root@localhost ~]$ type uptime
uptime is /usr/bin/uptime # 外部命令
# 查看和修改外部命令文件查找路径
[root@localhost ~]$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
[root@localhost ~]$ PATH=$PATH:/root/bin
[root@localhost ~]$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin
Linux系统中最重要的10个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称(远程与机器编码不同,导致的乱码可以使用此命令查看) |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
注意区分变量与环境变量
[root@localhost ~]$ echo $HOME
/root
[root@localhost ~]$ echo $SHELL
/bin/bash
[root@localhost ~]$ echo $LANG
en_US.UTF-8
[root@localhost ~]$ export $PRICE # 提升变量为全局变量,其他用户也可以使用
[root@localhost ~]$ env # 查看已经定义的环境变量