《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量
《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量
文章最后会post上书本的笔记照片。
文章主要内容:
输入输出重定向
输出重定向(命令执行结果 --> 文件):把原本要输出到屏幕的数据写入到指定文件。
- 标准输出信息:文件相关权限、所有者、所属组、文件大小以及修改时间等信息。
- 错误输出信息:报错提示信息。
- 关于重定向的符号">":一个">",即">",为清空写入;两个">",即">>",为追加写入。
- 标准输出重定向:仅重定向标准输出信息。符号:> 清空写入;>> 追加写入。
- 错误输出重定向:仅重定向错误输出信息。符号:2> 清空写入;2>> 追加写入。
- 标准/错误输出重定向:不论是标准输出信息还是错误输出信息都能重定向。符号:&> 清空写入;&>> 追加写入。
1 touch test.txt #创建空白的文本文件 2 ls -l anaconda-ks.cfg > test.txt #文件anaconda-ks.cfg是存在的,所以输出信息为标准输出信息。命令执行之前,test.txt文件是无内容的,执行后,test.txt就会有一条标准输出的内容。 3 ls -l qwer.txt 2> test.txt #文件qwer.txt是不存在的,所以输出信息为错误输出信息。由于采用的是清空写入,因此在写入错误输出信息之前会把文件test.txt的原有内容清空,再写入,此时test.txt只有一条错误输出信息。 4 ls -l asdf.txt &>> test.txt #因为不知道文件asdf.txt是否存在,所以干脆用&>>,无论是标准还是错误的输出信息都进行重定向。由于采用追加写入,test.txt原有内容不会被删除,直接在原内容的下一行写入信息,此时test.txt有两条信息。
输入重定向(文件内容 --> 命令):把文件导入到命令中,Linux命令可以从文件获取输入。输入重定向相对冷门,不常用。
输入重定向中用到的符号及其作用:
- 命令 < 文件:将文件作为命令的标准输入
- 命令 << 分界符:从标准输入中读入,直到遇见分界符才停止
- 命令 < 文件1 > 文件2:将文件1作为命令的标准输入并将标准输出到文件2
1 wc -l anaconda-ks.cfg #统计文件内容的行数。输出结果:47 anaconda-ks.cfg 2 wc -l < anaconda-ks.cfg #统计从标准输入读取的内容的行数。输出结果:47
两者之间的结果不同,是因为:
- 第一句命令的命令对象是一个文件,因此输出结果带有文件名。
- 第二句命令其实是通过标准输入读取了文件内容,再交给命令处理,因此第二句的命令对象实际是一段文本内容,因此就没有文件名输出了。
管道符(|)
管道符的作用:把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入。格式: 命令A | 命令B。
管道符的适用场景很多,可以组合多次:命令A | 命令B | 命令C。
1 grep "/sbin/nologin" /etc/passwd | wc -l #通过匹配关键词/sbin/nologin找出所有被限制登录系统的用户,并通过wc命令进一步统计行数,得出所有被限制登录系统的用户有多少个。 2 ls -l /etc | more #用翻页的形式查看/etc目录中的文件列表及属性信息 3 echo "123456" | passwd --stdin linuxprobe #给用户linuxprobe的密码重置为123456
通配符
通配符:通用的匹配信息的符号。
常用通配符:
- 星号(*):代表匹配零个或多个字符;
- 问号(?):代表匹配单个字符;
- 中括号([]):
- [0-9]代表匹配0到9之间的单个数字;
- [1,3,5]代表仅匹配1,3,5中的其中一个,等同[135];
- [1-2,5-6]表示匹配这两个区间内的数字,等同于[1,2,5,6];
- [abc]表示匹配a,b,c其中一个;
- [a-z]代表匹配26个小写字母其中一个,[A-Z]则是匹配大写字母;
例子:先创建一些空文件,名字都是sda开头,后面加一些数字结尾,分别是:1,3,4,5,23,100,199,203
ls -l sda* #结果:当前路径下所有sda开头的都列出来了 ls -l sda? #结果:sda1,sda3,sda4,sda5 ls -l sda[135] #结果:sda1,sda3,sda5 ls -l sda[1-2,5-6] #结果:sda1,sda5 ls -l sda[1-100] #结果:sda1
中括号是不支持匹配超过两位以上的内容的,只能匹配单个字符。
常用的转义字符
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
- 单引号(''):转义其中所有的变量为单纯的字符串。
- 双引号(""):保留其中的变量属性,不进行转义处理。
- 反引号(``):把其中的命令执行后返回结果。
1 PRICE=5 #定义一个变量(变量一般用大写)PRICE,值为5, 2 echo "Price is $PRICE" #结果:Price is 5。 3 echo "Price is $$PRICE" #结果:Price is 2682PRICE。$$作用是显示当前程序的进程ID号码(PID) 4 echo "Price is \$$PRICE" #结果:Price is $5。反斜杠把前面的$变成单纯的字符串
5 echo "Price is '$$$$'$PRICE" #结果:Price is 268226825。双引号在最外层,里层的单引号无法起到把$$变成普通字符串的作用 6 echo Price is '$$$$'$PRICE #结果:Price is $$$$5。最外层没有双引号括住,单引号起作用,$$只是单纯的字符串 7 echo '"Price is $$$$$PRICE"' #结果:"Price is $$$$$PRICE"。单引号在最外层,里层的双引号无法起到保留变量属性的作用 8 AB=`uname -a` #用反引号把命令括起来(`命令`),可以把命令的执行结果赋值给变量。
9 echo $AB #变量$AB的值就是uname -a的执行结果
重要的环境变量
命令在Linux中的执行步骤:
- 第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是则直接执行。
- 第2步:Linux系统检查用户输入的命令是否为“别名命令”。
- 第3步:Bash解释器判断用户输入的是内部命令还是外部命令。若是内部命令则直接执行,若是外部命令则进入下一步。
- 第4步:系统在多个路径中查找用户输入的命令文件。
1.路径:文件存放的地方。命令路径即命令文件存放的地方。
- 绝对路径:路径的写法一定是由根目录/写起的,如/bin/ls。
- 相对路径:路径写法不是由根目录/写起的。比如,用户cd到/bin,此时用户所在路径为/bin,那么用户要执行ls命令只需要输入ls,而不需要输入/bin/ls。
2.命令别名:
- alias命令:为命令创建别名。格式:alias 别名=命令。
- unalias命令:取消命令别名。格式:unalias 别名。
1 alias nmb='echo ni ma bi' #给命令echo ni ma bi起一个别名为nmb 2 alias nmb #查看别名nmb对应的真实命令 3 nmb #执行nmb别名命令,实际效果同echo ni ma bi,输出ni ma bi 4 unalias nmb #取消别名nmb 5 nmb #再执行别名nmb,发现已经无法使用了
3.type命令:用于判断用户输入的命令是内部命令还是外部命令。格式:type 命令名称。
1 type echo #输出结果:echo is a shell builtin,说明echo命令是内部命令 2 type rm #输出结果:rm is aliased to 'rm -i', 3 type mkdir #输出结果:mkdir is /usr/bin/mkdir,说明mkdir命令是外部命令
4.PATH变量:由多个执行命令的路径值组成的变量,每个路径之间用冒号:间隔。当用户输入的是外部命令,就需要通过PATH变量去查找外部命令的所在位置。
经典问题:将当前目录(.)添加到PATH中在某些情况下确实可以让用户免去输入命令所在路径的麻烦,但是如果系统被黑客入侵过并在公共目录存放了与命令名同名的木马文件,你又恰巧执行,那你就GG了。
env命令:用于查看系统所有的环境变量(挺多的)。
最重要的10个环境变量:
变量名称 | 作用 |
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
export命令:用于设置全局变量。格式:export 变量名。
1 TEST=7148 #当前用户为root,创建变量TEST,值为7148.这种方式创建的变量不会永久生效。仅对当前命令行窗口生效,若完整切换用户(su - XXX)后将失效.若要永久生效则要修改/etc/profile和~/.bashrc。 2 echo $TEST #输出变量TEST的值,输出结果为7148 3 su linuxprobe #切换到linuxprobe用户 4 echo $TEST #当前用户为linuxprobe,因为TEST不是全局变量,只有其创建者root才能使用。因此输出结果为空行 5 exit #退出linuxprobe 6 export TEST #linuxprobe退出后返回root,把变量变为全局变量 7 su linuxprobe #切换到linuxprobe 8 echo $TEST #此时TEST是全局变量,因此linuxprobe可以使用TEST,输出结果为7148
- /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置,
- /etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。
- ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
- ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。
书本笔记
-----/*看过许多光怪陆离的风景,才知俗世中最可畏是人心*/-----