第三章 管道符、重定向与环境变量
1 输入输出重定向
描述
- 标准输入重定向(STDIN, 文件描述符为0):默认从键盘输入,也可从其他文件或 命令中输入
- 标准输出重定向(STDOUT, 文件描述符为1):默认输出到屏幕
- 错误输出重定向(STDERR, 文件描述符为2):默认输出到屏幕。
- 对于重定向中的标准输出模式,可以省略文件描述符 1 不写,而错误输出模式的文件描 述符 2 是必须要写的
- 通过覆盖写入模式向文件中写入数据时,每 一次都会覆盖掉上一次写入的内容
输出重定向 例子
#覆盖
[root@linuxprobe~]# ls -l linuxprobe > /root/stderr.txt
[root@linuxprobe~]# ls -l linuxprobe 2> /root/stderr.txt
-rw-r--r--. 1 root root 0 Mar 1 13:30 linuxprobe
[root@linuxprobe~]# ls -l xxxxxx > /root/stderr.txt
cannot access xxxxxx: No such file or directory
[root@linuxprobe~]# ls -l xxxxxx 2> /root/stderr.txt
[root@linuxprobe~]# cat /root/stderr.txt
ls: cannot access xxxxxx: No such file or directory
#追加
[root@linuxprobe~]# ls -l linuxprobe &>> readme.txt
[root@linuxprobe~]# ls -l xxxxxx &>> readme.txt
-rw-r--r--. 1 root root 0 Mar 1 13:30 linuxprobe
cannot access xxxxxx: No such file or directory
输入重定向 例子
#把 readme.txt 文件导入给 wc -l 命令
[root@linuxprobe~]# wc -l < readme.txt
2
[root@linuxprobe~]# wc -l /etc/passwd
38 /etc/passwd
- 这里没有了文件名称。这是因为此前使用的“wc -l /etc/passwd”是一种非常标准的“命令+参数+对象”的执行 格式,而这次的“wc -l < readme.txt”则是将 readme.txt 文件中的内容通过操作符导入到命令 中,没有被当作命令对象进行执行,因此 wc 命令只能读到信息流数据,而没有文件名称的信息。
2 管道命令符
把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入
使用
- 计算被限制登陆的用户个数
[root@linuxprobe~]# grep /sbin/nologin /etc/passwd | wc -l
40
- 用户密码修改
[root@rhel7 ~]# passwd --stdin rusky 为rusky用户设置密码。
Changing password for user rusky.
zxcvbnm
passwd: all authentication tokens updated successfully.
[root@rhel7 ~]# echo "qwert"
qwert
[root@rhel7 ~]# echo "qwert" | passwd --stdin rusky 把echo返回的字符qwert设置为用户rusky的密码
Changing password for user rusky.
passwd: all authentication tokens updated successfully.
- 命令 A | 命令 B | 命令 C
[root@linuxprobe~]# ps aux | grep bash | tee result.txt
root 1070 0.0 0.1 25384 2324 ? S Sep21 0:00 /bin/bash /usr/sbin/ksmtuned
root 3899 0.0 0.2 26540 5136 pts/0 Ss 00:27 0:00 bash
root 4320 0.0 0.0 12112 1112 pts/0 S+ 00:51 0:00 grep --color=auto bash
[root@linuxprobe~]# cat result.txt
root 1070 0.0 0.1 25384 2324 ? S Sep21 0:00 /bin/bash /usr/sbin/ksmtuned
root 3899 0.0 0.2 26540 5136 pts/0 Ss 00:27 0:00 bash
root 4320 0.0 0.0 12112 1112 pts/0 S+ 00:51 0:00 grep --color=auto bash
#tee命令:同时输出到屏幕和文件中
3 命令行通配符
描述
星号(*)代表匹配零个或多个字符, 问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配 0~9 之间的单个数字的字符, 而中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符。
使用
- 匹配:硬盘文件和分区只有 3 个,sda, sda1, sda2
[root@linuxprobe~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 May 4 15:55 /dev/sda
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe~]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
- 批量创建文件:通配符不仅可用于搜索文件或代替被通配的字符,还可以与创建文件的命令相结合, 一口气创建出好多个文件。不过在创建多个文件时,需要使用大括号,并且字段之间用逗号间隔。
[root@linuxprobe~]# touch {AA,BB,CC}.conf
[root@linuxprobe~]# ls -l *.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 AA.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 BB.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 CC.conf
- 输出指定信息
[root@linuxprobe~]# echo file{1,2,3,4,5}
file1 file2 file3 file4 file5
4 常用转义字符
4个常用转义字符
- 反斜杠(\): 使反斜杠后面的一个变量变为单纯的字符。
- 单引号(’ '): 转义其中所有的变量为单纯的字符串。
- 双引号(" "): 保留其中的变量属性,不进行转义处理。
- 反引号(``): 把其中的命令执行后返回结果。
tips
- 是否加双引号:如果参数中出现了 空格,就加双引号;如果参数中没有空格,那就不用加双引号
5 重要的环境变量
命令在linux中执行的四个步骤
-
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是绝对 路径则直接执行,否则进入第 2 步继续判断。
-
第2步: Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名 称来替换原本的命令名称。
-
第3步:Bash 解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部 的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤 4 继 续处理。
-
可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令
[root@linuxprobe~]# type echo echo is a shell builtin [root@linuxprobe~]# type uptime uptime is /usr/bin/uptime
-
-
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存 放的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找。
- 对这些路径的增加和删除操作将影响到 Bash 解释器对 Linux 命令的查找。
[root@linuxprobe~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin [root@linuxprobe~]# PATH=$PATH:/root/bin [root@linuxprobe~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin
创建命令别名
可以用 alias 命令来创建一个属于自己的命令别名,语法格式为“alias 别名=命令”。若要 取消一个命令别名,则是用 unalias 命令,语法格式为“unalias 别名”
[root@linuxprobe~]# unalias rm
[root@linuxprobe~]# rm initial-setup-ks.cfg
环境变量
- 在接手一台 Linux 系统后一定会在执行 命令前先检查 PATH 变量中是否有可疑的目录
- 可以使用 env 命令来查看 Linux 系统中所有的环境变量
- 重要环境变量
- 一个相同的变量会因为用户身份的不同而具有不同的值。
[root@linuxprobe~]# echo $HOME
/root
[root@linuxprobe~]# su - linuxprobe
[linuxprobe@linuxprobe~]$ echo $HOME
/home/linuxprobe
- 自行创建变量
[root@linuxprobe~]# mkdir /home/workdir
[root@linuxprobe~]# WORKDIR=/home/workdir
[root@linuxprobe~]# cd $WORKDIR
[root@linuxprobe workdir]# pwd
/home/workdir
#这样创建变量不具备全局性,作用范围也有限,默认情况下不能被其他用户使用
[root@linuxprobe workdir]# su linuxprobe
[linuxprobe@linuxprobe~]$ cd $WORKDIR
[linuxprobe@linuxprobe~]$ echo $WORKDIR
[linuxprobe@linuxprobe~]$ exit
- 全局变量:可以使用 export 命令将其提升为全局变量,这样其他用户也就可以使用 它
[root@linuxprobe~]# export WORKDIR
[root@linuxprobe~]# su linuxprobe
[linuxprobe@linuxprobe~]$ cd $WORKDIR
[linuxprobe@linuxprobe workdir]$ pwd
/home/workdir
#后续不使用,可用unset命令取消
[root@linuxprobe~]# unset WORKDIR
- 变量永久生效:直接在终端设置的变量能够立即生效,但在重启服务器后就会失效,因此我们需要将变量和变量值写入到**.bashrc 或者.bash_profile 文件**中,以确保永久能使用它们。