1、输入输出重定向
-
重定向分类
- 标准输入重定向(STDIN,文件描述符为0):把文件导入到命令中。
- 标准输出重定向(STDOUT,文件描述符为1):正常的信息会写入文件,错误的信息链接至终端(打印到屏幕上)
- 错误输出重定向(STDERR,文件描述符为2):错误的信息会写入文件,正常的信息链接至终端(打印到屏幕上)
-
标准输出重定向
对于重定向中的标准输出模式,可以省略文件描述符1不写,但错误输出模式的文件描述符2一定要写
eg:ls -l examples.desktop > readme.txt
假设文件examples.desktop
存在,则会将该文件的具体信息写入文件readme.txt
中,并且文件readme.txt
中的数据会被清空。(覆盖写入)
eg:echo "This is a file" >> readme.txt
将字符串信息This is a file
追加到文件readme.txt
中。(追加写入)
eg:ls -l xxxxx > readme.txt
假设文件xxxxx
不存在,则屏幕会打印信息ls: 无法访问'xxxxx': 没有那个文件或目录
,并且文件readme.txt
中的内容被清空
eg:ls -l xxxxx >> readme.txt
假设文件xxxxx
不存在,则屏幕会打印信息ls: 无法访问'xxxxx': 没有那个文件或目录
,并且没有内容追加到文件readme.txt
中。 -
错误输出重定向
特别注意:文件描述符和重定向符之间不能有空格
eg:ls -l examples.desktop 2> readme.txt
假设文件examples.desktop
存在,则屏幕中会打印出文件examples.desktop
的具体信息,并且文件readme.txt
中的内容被清空
eg:ls -l examples.desktop 2>> readme.txt
假设文件examples.desktop
存在,则屏幕中会打印出文件examples.desktop
的具体信息,并且没有内容追加到文件readme.txt
中。
eg:ls -l xxxxxx 2> readme.txt
假设文件xxxxxx
不存在,则错误信息会写入文件readme.txt
中,使用cat
命令后会显示:ls: 无法访问'xxxxx': 没有那个文件或目录
,屏幕不显示内容。
eg:ls -l xxxxxx 2>> readme.txt
假设文件xxxxxx
不存在,则错误信息会追加到文件readme.txt
中。 -
不区分标准输出和错误输出(正常和错误的信息均会写入文件)
eg:ls -l examples.desktop &> readme.txt ls -l xxxxx &>> readme.txt
使用
cat
命令后的输出结果为:-rw-r--r-- 1 lh lh 8980 11月 16 2021 examples.desktop ls: 无法访问'xxxxx': 没有那个文件或目录
-
输入重定向
eg:wc -l < examples.desktop
把文件examples.desktop
导入到命令wc -l
,最后输入文件的行数:240
eg:wc -l examples.desktop
标准执行格式,最后输出:240 examples.desktop
,即行数+文件名称
2、管道命令符
Tips:把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入
- 执行格式:
命令A | 命令B | 命令C | ...
eg:grep /sbin/nologin /etc/passwd | wc -l
把原本要输出到屏幕的用户信息列表交给wc
命令作进一步的加工,最后输出行数。
eg:ls -l /etc/ | more
以翻页的形式查看/etc
目录中的文件列表及属性信息,原本这些信息会大量输出到屏幕中。
eg:ps -aux | grep bash
搜索与bash
有关的进程信息。
eg:ps -aux | grep bash | tee result.txt
搜索与bash
有关的进程信息,并同时输出到屏幕和文件中。
3、命令行的通配符
- 通配符
*
eg:ls -l /dev/sda*
匹配所有在/dev
目录中且以sda
开头的文件。通配符*
可以放在前面、中间和后面的任意一个位置。 - 通配符
?
eg:ls -l /dev/sda?
匹配所有在/dev
目录中、以sda
开头并且后面仅跟随一个字符的文件。 - 通配符
[num-num]
eg:ls -l /dev/sda[0-9]
匹配所有在/dev
目录中、以sda
开头并且后面仅跟随0~9之间的单个数字的文件。 - 通配符
[num]
eg:ls -l /dev/sda[135]
匹配所有在/dev
目录中、以sda
开头并且后面仅跟随{1,3,5}的单个数字的文件。 - 通配符
{}
eg:touch {AA,BB,CC}.conf
一口气创建多个文件,本例创建的文件分别是AA.conf
、BB.conf
和CC.conf
eg:echo file{1,2,3,4}
打印多个信息,本例分别file1
、file2
、file3
和file4
4、常用的转义字符
- 转义字符
""
和\
eg:
先定义一个名为PRICE=5 echo "Price is \$$PRICE"
PRICE
的变量并赋值为5
,然后输出对应的字符串。本例的输出结果为Price is $5
。注:转义字符""
意为保留其中的变量属性,不做转义处理;转义字符\
意为使反斜杠后面的一个变量变为单纯的字符。 - 转义字符
''
eg:
本例的输出结果为PRICE=5 echo 'Price is \$$PRICE'
Price is \$$PRICE
。注:转义字符''
意为转义其中所有的变量为单纯的字符串。 - 转义字符反引号
eg:
本例中使用echo `uname -a`
echo
命令来查看本机的Linux版本的内核信息。注:转义字符反引号意为把其中的命令执行后返回结果。 - 带双引和不带双引的区别
eg:
返回的结果均是echo AA BB CC echo "AA BB CC"
AA BB CC
,两者的区别在于第一种执行方式用户无法确定有几个参数,有可能AA BB CC
当作一个参数直接输出到屏幕中,也有可能把AA
、BB
和CC
分别输出到屏幕中。
技巧:参数中出现了空格,就加双引号,否则不用加
5、重要的环境变量
- Linux执行命令的4个步骤
- 判断用户是否以绝对用户或相对路径的方式输入命令(如
/bin/ls
),如果是绝对路径则直接执行,否则进入第2步继续判断。 - Linux系统检查用户输入的命令是否为“别名命令”
系统默认rm
命令别名为rm -i
,即删除文件时会弹出提示信息。
eg:alias cdhome='cd ~'
自定义命令的别名,将命令cd ~
别名为cdhome
;即使用cdhome
命令则可以返回家目录,但下次开机则会失效。
eg:unalias cdhome
取消别名,使得别名失效,执行本例后cdhome
命令将失效。 - Bash解释器判新用户输入的是内部命令还是外部命令。内部命令是解释器内的指令,会被直接执行,而用户在绝大部分时间输人的是外部命令,这些命令交由步骤4继续
eg:type echo //输出信息:echo is a shell builtin type uptime //输出信息: uptime is /usr/bin/uptime
- 系统在多个路径中查找用户输人的命令文件,而定义这些路径的变量叫作 PATH。作用是告诉 Bash 解释器待执行的命令可能有放的位置,然后 Bash 解释器就会在这些位置中逐个查找(地址以冒号分隔)。
eg:echo $PATH //输出信息: /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
- 环境变量
HOME
eg:echo $HOME
查看用户的主目录(Linux是一个多用户的操作系统,每个用户所处的工作环境不同)。 - 自行创建变量
eg:
设置一个名称为mkdir ~/example WORKDIR=~/example
WORKDIR
的变量,执行命令cd $WORKDIR
就可以跳转到目录~/example
。 - 扩大变量的使用范围
eg:export WORKDIR
使用export
命令后,Linux下的所有用户都能够使用变量WORKDIR
- 取消变量
eg:unset WORKDIR
之后WORKDIR
变量将消失。