前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
目录
一、输入输出重定向
二、管道命令符
三、命令行的通配符
四、常用的转义字符
五、重要的环境变量
致谢
一、输入输出重定向
输入重定向是指把文件导入到命令中,而输出重定向则是把原本要输出到屏幕的的数据信息写入到指定文件中。在日常的学习和工作中,输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式
- 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,可以从其他文件或命令中输入
- 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕
比如分别查看两个文件的属性信息,一个文件存在,一个不存在。虽然两个文件的操作都会在屏幕上输出一些信息,但这两个操作的差异其实很大:
[root@linux ~]# touch linuxprobe
[root@linux ~]# ls -l linuxprobe
-rw-r--r-- 1 root root 0 Oct 1 15:13 linuxprobe
[root@linux ~]# ls -l xxxxxx
ls: cannot access 'xxxxxx': No such file or directory
第一个的输出信息是该文件的一些相关权限、所有者、所属组、文件大小及修改时间等信息,这也是该命令的标准输出信息。而第二个是该命令的错误输出信息。那么,要想把原本输出到屏幕的数据转而写入到文件当中,就要区别对待这两种输出信息
对于输入重定向来讲,用到的符号及其作用:
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
对于输出重定向来讲,用到的符号及其作用:
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件这种(追加到原有内容的后面) |
对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。
# 通过标准输出重定向将man bash命令原本要输出到屏幕的信息写入到文件readme.txt中,然后显示readme.txt文件中的内容。
[root@linux ~]# man bash > readme.txt
[root@linux ~]# cat readme.txt
...
接下来尝试重定向技术中的覆盖写入与追加写入
# 覆盖写入
[root@linux ~]# echo "Welcom to LinuxProbe.Com" > readme.txt
[root@linux ~]# echo "Welcom to LinuxProbe.Com" > readme.txt
[root@linux ~]# echo "Welcom to LinuxProbe.Com" > readme.txt
[root@linux ~]# cat readme.txt
Welcom to LinuxProbe.Com
# 追加写入
[root@linux ~]# echo "Quality Linux learning materials" >> readme.txt
[root@linux ~]# cat readme.txt
Welcom to LinuxProbe.Com
Quality Linux learning materials
虽然都是输出重定向技术,但是命令的标准输出和错误输出还是有区别的。标准输出可以将信息输入到文件中,而非错误的输出重定向依然输出到屏幕上。
[root@linux ~]# ls -l linuxprobe > /root/stderr.txt
[root@linux ~]# ls -l linuxprobe 2> /root/stderr.txt
-rw-r--r-- 1 root root 0 Oct 1 15:13 linuxprobe
[root@linux ~]# ls -l xxxxxx > /root/stderr.txt
ls: cannot access 'xxxxxx': No such file or directory
[root@linux ~]# ls -l xxxxxx 2> /root/stderr.txt
[root@linux ~]# cat /root/stderr.txt
ls: cannot access 'xxxxxx': No such file or directory
还有一种情况,不区分标准还是错误输出,全部追加到文件中,使用&>>操作符
[root@linux ~]# ls -l linuxprobe &>> readme.txt
[root@linux ~]# ls -l xxxxx &>> readme.txt
[root@linux ~]# cat readme.txt
-rw-r--r-- 1 root root 0 Oct 1 15:13 linuxprobe
ls: cannot access 'xxxxx': No such file or directory
输出重定向的作用是把文件直接导入到命令中。接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数
[root@linux ~]# wc -l < readme.txt
2
二、管道命令符
管道命令符格式:“命令A|命令B”。作用可以用一句话来概括:“把前一个命令原本要输出到屏幕的信息当作是后一个命令的标准输入”
找出被限制登录用户的命令是:grep /sbin/nologin /etc/passwd
统计文本行数的命令则是:wc -l
合并为一条:
[root@linux ~]# grep /sbin/nologin /etc/passwd | wc -l
可以将ps、grep、管道符三者结合到一起使用。搜索与bash有关的进程信息:
[root@linux ~]# ps aux | grep bash
root 31303 0.0 0.0 226248 5368 pts/0 Ss 08:04 0:00 bash
root 32790 0.0 0.0 226120 5260 pts/0 S 10:16 0:00 bash
root 33642 0.0 0.0 226120 5136 pts/0 S+ 11:23 0:00 bash
...
如果需要将管道符处理后的结果既输出到屏幕,又同时写入到文件,则可以与tee命令结合使用
[root@linux ~]# ps aux | grep bash | tee result.txt
root 31303 0.0 0.0 226248 5368 pts/0 Ss 08:04 0:00 bash
root 32790 0.0 0.0 226120 5260 pts/0 S 10:16 0:00 bash
root 33642 0.0 0.0 226120 5136 pts/0 S+ 11:23 0:00 bash
...
[root@linux ~]# cat result.txt
root 31303 0.0 0.0 226248 5368 pts/0 Ss 08:04 0:00 bash
root 32790 0.0 0.0 226120 5260 pts/0 S 10:16 0:00 bash
root 33642 0.0 0.0 226120 5136 pts/0 S+ 11:23 0:00 bash
...
三、命令行的通配符
通配符就是通用的匹配信息的符号
通配符 | 含义 |
---|---|
* | 任意字符 |
? | 单个任意字符 |
[a-z] | 单个小写字母 |
[A-Z] | 单个大写字母 |
[a-Z] | 单个字母 |
[0-9] | 单个数字 |
[:alpha:] | 任意字母 |
[:upper:] | 任意大写字母 |
[:lower:] | 任意小写字母 |
[:digit:] | 所有数字 |
[:alnum:] | 任意字母加数字 |
[:punct:] | 表单符号 |
示例:匹配所有在/dev目录中且以sda开头的文件:
[root@linux ~]# ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 Oct 1 11:56 /dev/sda
brw-rw---- 1 root disk 8, 1 Oct 1 11:56 /dev/sda1
brw-rw---- 1 root disk 8, 2 Oct 1 11:56 /dev/sda2
如果只想查看文件名以sda开头,但是后面还紧跟其他某一个字符的文件的相关信息
[root@linux ~]# ls -l /dev/sda?
brw-rw---- 1 root disk 8, 1 Oct 1 11:56 /dev/sda1
brw-rw---- 1 root disk 8, 2 Oct 1 11:56 /dev/sda2
除了使用[0-9]来匹配0~9之间的数字,也可以用[135]这样的方式仅匹配这三个指定数字中的一个,若没有匹配到则不会显示出来。
[root@linux ~]# ls -l /dev/sda[0-9]
brw-rw---- 1 root disk 8, 1 Oct 1 11:56 /dev/sda1
brw-rw---- 1 root disk 8, 2 Oct 1 11:56 /dev/sda2
[root@linux ~]# ls -l /dev/sda[135]
brw-rw---- 1 root disk 8, 1 Oct 1 11:56 /dev/sda1
通配符也不一定要放最后,也可以搜索/etc/目录中所有以.conf结尾的配置文件有哪些:
[root@linux ~]# ls -l /etc/*.conf
-rw-r--r--. 1 root root 55 May 17 2023 /etc/asound.conf
-rw-r--r--. 1 root root 25696 Oct 22 2020 /etc/brltty.conf
-rw-r--r--. 1 root root 1113 Mar 13 2024 /etc/chrony.conf
...
通配符不仅用于搜索文件或代替被通配的字符,还可以与创建文件命令相结合,唯一区别是要用到大括号,并且字段之间用逗号间隔:
[root@linux ~]# touch {AA,BB,CC}.conf
[root@linux ~]# ls -l *.conf
-rw-r--r-- 1 root root 0 Oct 1 16:34 AA.conf
-rw-r--r-- 1 root root 0 Oct 1 16:34 BB.conf
-rw-r--r-- 1 root root 0 Oct 1 16:34 CC.conf
再或者输出一些指定的信息
[root@linux ~]# echo file{1,2,3,4,5}
file1 file2 file3 file4 file5
四、常用的转义字符
为了更好的理解用户的表达,Shell解释器还提供了特别丰富的转义字符来处理输入的特殊数据。
4个最常用的转义字符如下:
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符
- 单引号(''):转义其中所有的变量为单纯的字符串
- 双引号(""):保留其中的变量属性,不进行转义处理
- 反引号(``):把其中的命令执行后返回结果
先定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息:
[root@linux ~]# echo "Price is $PRICE"
Price is 5
[root@linux ~]# echo "Price is \$$PRICE"
Price is $5
当只需要某个命令的输出值时,可以像命令
这样,将命令用反引号括起来,打到预期效果
[root@linux ~]# echo `uname -a`
Linux linux 4.18.0-513.5.1.el8_9.x86_64 #1 SMP Fri Sep 29 05:21:10 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux
对于双引号和单引号的使用,这里给出一个小技巧,就是参数中如果出现了空格,那么就加双引号,如果参数中没有空格,那就不用加~
五、重要的环境变量
变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,命令则都是小写的。
在用户执行了一条命令后,Linux系统中到底发生了什么事情呢?简单说,有4个步骤:
- 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),是的话则执行
-
Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称
之前在使用rm命令删除文件时,Linux系统都会要求用户再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm命令。
[root@linux ~]# ls
AA.conf anaconda-ks.cfg BB.conf CC.conf Desktop Documents Downloads initial-setup-ks.cfg linuxprobe Music Pictures Public readme.txt result.txt stderr.txt Templates Videos
[root@linux ~]# rm anaconda-ks.cfg
rm: remove regular file 'anaconda-ks.cfg'? y
也可以使用alias命令来创建一个属于自己的命令别名,语法:“alias 别名=命令”,如要取消一个命令别名,则是用unalias命令。语法格式:“unalias 别名”
[root@linux ~]# unalias rm
[root@linux ~]# rm anaconda-ks.cfg
[root@linux ~]#
-
Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤四继续处理。可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令:
[root@linux ~]# type echo
echo is a shell builtin
[root@linux ~]# type uptime
uptime is /usr/bin/uptime
-
系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫PATH,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
[root@linux ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@linux ~]# PATH=$PATH:/root/bin
[root@linux ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
Linux系统中最重要的10个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作环境,因此,一个相同的变量会因为用户身份的不同而不同。
[root@linux ~]# echo $HOME
/root
[root@linux ~]# su - linuxprobe
[linuxprobe@linux ~]# echo $HOME
/home/linuxprobe
可以自行创建变量,例如设置一个名称为WORKDIR的变量,方便用户更轻松的进入一个层次较深的目录:
但这样的变量不具有全局性,作业范围也有限,默认不能被其他用户使用
[root@linux ~]# mkdir /home/workdir
[root@linux ~]# WORKDIR=/home/workdir
[root@linux ~]# cd $WORKDIR
[root@linux workdir]# pwd
/home/workdir
[root@linux workdir]# su linuxprobe
[linuxprobe@linuxprobe ~]# cd $WORKDIR
[linuxprobe@linuxprobe ~]# echo $WORKDIR
[linuxprobe@linuxprobe ~]# exit
后续要是不使用,则用unset命令取消
[root@linux workdir]# unset WORKDIR
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!