Linux就该这么学
第二章:管道符、重定向与环境变量
管道符命令 管道符命令“|”的作用是将前一个命令的标准输出当作后一个命令的标准输入,格式为:“命令A | 命令B”。(管道符命令可以多次使用:命令A | 命令B | 命令C)
例1: 想要统计所有不允许登陆系统的用户数量怎么用一条命令执行:
首先找出被限制登陆用户的命令是:# grep "/sbin/nologin" /etc/passwd
然后统计文本行数的命令是:# wc -l
于是我们可以通过管道符命令“|”将这两个命令链接起来就可以实现目标输出了:# grep "/sbin/nologin" /etc/passwd | wc -l
例2: 向hxm用户发送一封邮件¹:# echo "Content" | mail -s "Subject" hxm
使用非交互式²设置用户密码,将root的密码修改为sewy:# echo "sewy" | passwd --stdin root
注释1:linux发送邮件可能会遇到发送失败,不支持邮件发送的情况,这时候就需要查看下inet_protocols协议的配置了:# /usr/sbin/postconf |grep inet_protocols 输出:inet_protocols = all
这时候就需要修改ipv4:# vi /etc/postfix/main.cf 将其中的 inet_protocols = all 改为 inet_protocols = ipv4 然后重启postfix:# service postfix restart
注释2:非交互式就是指shell不与你交互,直接执行文件或命令并结束完成;交互式是指shell等待你的输入,并执行你提交的命令,需要shell与你进行交互。
输入输出重定向 对于输出或输入做一些处理。 ---------------------------------------------- 10-25 ------------------------------------------
标准输入(STDIN,文件描述符为0):默认从键盘输入,为0时表示从其他文件或命令的输出。
标准输出(STDOUT,文件描述符为1):默认输出到屏幕,为1时表示是文件。
错误输出(STDERR,文件描述符为2):默认输出到屏幕,为2时表示是文件。
符号 作用 符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据) 命令 < 文件 将文件作为命令的标准输入
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据) 命令 << 分界符 从标准输入中读取,直到遇到“分界符”才停止
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面) 命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出输出到文件2
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>$1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
例如:
将man命令的帮助文档写入到/root/man.txt中:# man bash > /root/man.txt
向readme.txt中写入一行文字:# echo "Welcome to the world of Linux!" > readme.txt
向readme.txr中追加一行文字:# echo "Linux is so easy" >> readme.txt
查看readme.txt中的内容:# cat readme.txt
Welcome to the world of Linux!
Linux is so easy
把readme.txt文件作为输入重定向给wc -l命令来计算行数,命令等同于“cat readme.txt | wc -l”:# wc -l < readme.txt 输出:2
用echo、mail和管道符命令(|)发给hxm用户一封邮件,但内容只能有一句话:# echo "Hello Hxm!" | mail -s "Title" hxm
如果不局限于一句话且标题为“Mail”的邮件,那就逐行输入,直到分界符才停止:# mail -s "Mail" 824087197@qq.com << over
> Hello Hxm!
> How are you?
> I heard that you are using millet phone, really?
> I think that must be cool.
> over
正常情况下输入分界符后会结束输入操作并发送邮件,不会有报错信息。
如果咱们用“ls”命令查看文件信息,若文件不存在则将报错信息输出到“/root/stderr.txt”中:# ls heheda 2> /root/stderr.txt
如果“cat /root/stderr.txt”后文件为空,则表示有heheda文件,所以没有报错信息,如果不为空,则里面的文件内容为:ls: cannot access heheda: No such file or directory
命令行通配符 为了更方便的对命令进行批量的特殊处理。 -------------------------------------------------------- 11-15 ----------------------------------------------------
通配符 含义 通配符 含义 通配符 含义 通配符 含义
* 匹配零个或多个字符 ? 匹配任意单个字符 [0-9] 匹配范围内的数字 [abc] 匹配已出的任意字符
另外bash解释器还支持很多的特殊字符扩展:
字符 作用 字符 作用 字符 作用 字符 作用
\(反斜杠) 转义后面单个字符 ''(单引号) 转义所有的字符 ""(双引号) 变量依然生效 ``(反引号) 执行命令语句
例如执行uname -a 后可以查看本机内核的版本与架构信息(反引号里面的命令会被执行):
# echo `uname -a` 输出:Linux iZ28jc899pfZ 3.10.0-123.9.3.el7.x86_64 #1 SMP Thu Nov 6 15:06:03 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
实用的PATH变量 alias命令用于设置命令的别名,格式为:“alias 别名=命令”。例如可以将询问复制命令起个别名:# alias cp="cp -i"
unalias命令则用于取消命令的别名,格式为:“unalias 别名”。
内部命令:属于解释器内部的; 外部命令:独立于解释器外的命令文件;
想要判断某个命令是“内部命令”,还是“外部命令”,可以通过执行“type 命令名称”来判断,例如:type pwd。输出结果为:pwd is a shell builtin。
重要的环境变量 在Linux中有许多的环境变量,我们可以用“env”命令来查看到它们。 --------------------------------------------- 11-16 ---------------------------------------------
变量是由固定的“变量名”与用户或系统设置的“变量值”两部分组成的,如果有需求可直接修改。
变量名称 作用 变量名称 作用 变量名称 作用 变量名称 作用
HOME 用户的主目录的“家” MAIL 邮件信箱文件 PS1 bash提示符 EDITOR 默认文本编辑器
SHELL 当前的shell是哪个程序 LANG 语言数据 HISTFILESIZE history命令存储数量 HOME 用户主目录
HISTSIZE 历史命令记录条数 RANDOM 随机数字 PATH 在路径中的目录查找执行文件
可以用“echo $HOME”来查看当前用户的家目录是哪个,一般是“/root”。
例:假设需要设置一个变量“WORKDIR”,让用户执行“cd $WORKDIR”就登陆到/home/workdir目录中,该怎么实现?
定义方法:变量名称=新的值 查看方法:echo $变量名称
首先创建该目录:# mkdir /home/workdir 然后设置变量:# WORKDIR=/home/workdir 然后执行:# cd $WORKDIR 就可以了
不过该变量名称只能当前用户可以使用,其他用户使用不了,因为它是一个局部的变量,如果想让每一个用户都可以使用该变量的话,需要将它设置成全局变量:export命令用户将局部变量提升为全局变量,格式
为:“export 变量名[=变量值]”。将WORKDIR设置成全局变量:# export WORKDIR。这样的话其他用户就都可以使用该变量了。