Linux学习(二)

管道符 重定向与环境变量

输入输出重定向

  • 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令中输入
  • 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
  • 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕

比如分别查看两个文件的属性信息,我们先创建第一个文件,而第二个文件是不存在的.所以针对这两个文件的操作都分别会在屏幕上输出一些信息

image-20220321151203749

上述命令中,名为1的文件是真实存在的,输出信息是该文件的相关权限 所有者 文件大小 及修改时间等信息 这也是该命令的标准输出信息 而名为xxxx 的文件本来是不存在的,因此在执行完该ls 命令之后显示的报错信息也是该命令的错误输出信息.那么想要把原本输出到屏幕上的数据转而写入文件中,就需要区别对待这两种输出信息

输入重定向中用到的符号及其作用

符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2

输出重定向中用到的符号及其作用

符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

对于重定向中的标准输出模式,可以省略文件描述符1 不写,而错误输出模式的文件描述2是必须要写的 .通过标准输出重定向将 man bash命令原本要输出到屏幕的信息写入到文件readme.txt中,然后显示该文件中的内容

image-20220321151943105

接下来将使用覆盖写入与追加写入这两种不同的模式带来的变化 首先通过覆盖写入模式像readme.txt文件写入多行数据,这个命令只会剩下最后一次的

image-20220321152327141

使用追加的方式向readme.txt文件写入一次数据,然后执行

image-20220321164528752

虽然都是重定向,但是命令的标准输出和错误输出还是有区别的.

将错误的信息输出到文件中去

image-20220321165050759

还有就是不区分标准输出和错误输出,只要命令有输出信息就追加写入到文件中.这就要用到&>>操作符了

image-20220321165844731

输出重定向的作用就是把文件直接导入到命令中 接下来使用输出重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数

image-20220321170039490

管道命令符

管道命令符的作用也可以概括为一句话 把前一个命令原本要输出到屏幕的信息当做后一个命令的标准输入,我们通过匹配关键字/sbin.nologin找出了所有被限制登录系统的用户

  • 找出被限制登录的名称是grep /sbin/nologin /etc/passwd
  • 统计文本函数的命令时wc -l

现在需要做的是把grep搜索命令的输出值传递给wc统计命令,即把原本要输出到屏幕的用户信息列表在交给wc命令做进一步的加工,因此只需要把管道符放到两条语句之间即可

image-20220321170638770

比如用翻页的模式查看/etc目录中的文件列表及属性信息

image-20220321170817968

在修改用户密码时,通常需要输入两次密码以进行确认,这在编写自动化脚本的时候将成为一个非常致命的缺陷,通常把管道符和passwd命令的–stdin参数相结合,可以使用一条命令来完成密码重置操作

image-20220321171033943

在输入ps aux命令后屏幕上的信息呼呼闪过,看不到有用信息,现在可以将ps grep 管道符 三者结合到一起使用了 下面搜索与bash 有关的进程信息

image-20220321171257391

如果需要将管道符处理后的结果既要输出到屏幕,又同时写入到文件中,则可以与tee命令相结合使用

下面的命令将显示系统中所有与bash相关的进程信息,并同时将输出到屏幕和文件中

image-20220321171555470

命令行的统配符

比如,我们想要批量查看所有硬盘文件的相关权限属性.这些硬盘设备文件都是以sda开头并且存放到了/dev目录中,这样一来,即使不知道硬盘的分区编号和具体分区的个数,也可以使用通配符来搞定

通配符就是通用的匹配信息的符号,比如星号*代表匹配零个或者多个符号,问号?表示匹配单个字符,中括号内加上数字[0-9]表示匹配0-9之间的单个数字的字符,而中括号内加上字母[abc]则是表示匹配abc三个字符中的任意一个字符

Linux系统中的通配符及含义

通配符 含义
* 任意字符
? 单个任意字符
[a-z] 单个小写字母
[A-Z] 单个大写字母
[a-Z] 单个字母
[0-9] 单个数字
[[:alpha:]] 任意字母
[[:upper:]] 任意大写字母
[[:lower:]] 任意小写字母
[[:digit:]] 所有数字
[[:alnum:]] 任意字母加数字
[[:punct:]] 标点符号

匹配所有在/dev目录中且以sda开头的文件

image-20220321172103645

如果只是想查看文件名以sda开头,但是后面还仅跟着其他某一个字符的文件的相关信息,这时就需要用到问号来进行统配了

image-20220321172316728

除了使用[0-9]来匹配0-9之间的单个数字,也可以使用[125]这样的方式仅匹配3个指定数字中的一个;若没有匹配出来就不会显现出来

image-20220321172516258

通配符不一定非要放到最后,也可以放到前面,比如可以使用以下的命令来搜索/etc/目录中所有以.config为结尾的配置文件有哪些

image-20220321172641793

通配符不仅可以用于搜索文件或者代替通配符的字符,还可以与创建文件命令相结合,一口气创建出多个文件.不过在创建文件的时候,需要使用大括号,并且字段之间用逗号隔开

image-20220321172901655

通配符还可以输出指定的信息

image-20220321172958974

常用的转义字符

常用的转义字符

  • 反斜杠(\) :使反斜杠后面的一个变量变为单纯的字符
  • 单引号(‘’):转义其中所有的变量为单纯的字符串
  • 双引号(“”):保留其中的变量属性,不进行转义处理
  • 反引号(``):把其中的命令执行后返回结果

我们先定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息

image-20220322180856525

我们接下来希望能输出”Price is $5”,即”价格是5美元”的字符串内容,但碰巧美元符号与变量提取符号合并之后的$$作用是显示当前程序的进程ID号码,于是命令执行后的输出的内容弄并不是我们所预期的

image-20220322181355715

想要第一个$称为美元复发,那么需要使用反斜杠(\)来进行转义,将这个命令提取符转义成单纯的文本

image-20220322181515717

而如果只需要某个命令的输出值,可以像``命令一样,将命令用反引号括起来,达到预期的效果.例如,将反引号与uname -a命令结合,然后使用echo命令来查看本机的linux版本和内核信息.

image-20220322181724621

反斜杠胡反引号的功能比较有特点

image-20220322182000968

两者的区别在与用户无法得知第一种执行方式中到底有几个参数,因为有可能把”AA BB CC”当成一个参数整体输出到屏幕上,也有可能将AA BB CC分别输出到屏幕上

如果参数中出现了空格,就加上单引号,如果参数中没有空格,那么就不用加双引号

环境变量

变量是计算机系统用于保存可变值的数据类型,在linux系统中,变量名称一般都是大写的,命令则都是小写的,这是一种规范.linux中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录,邮件存在的位置等.可以直接通过变量的名称来提取对应的变量值.

linux中命令在执行时分为四个步骤

  1. 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是绝对路径则直接执行,否则进入第二步继续判断

  2. linux系统检查用户输入的命令是否为”别名命令”,即一个自定义的命令名称来提换原本的命令名称之前在使用rm命令删除文件时,linux系统都会要求用户确认是否执行删除操作,其实这就是linux系统为了防止用户误删除文件而特意设置的rm别名命令 “rm -i”image-20220322183042074可以使用alias命令来创建一个属于自己的命令别名,语法格式为”alias别名=命令” 若要取消一个命令的别名,则是用unalias命令,语法

    unalias 别名
  3. Bash解释器判断用户输入的是内部命令还是外部命令.内部命令时解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理.可以使用”type命令名称”来判断用户输入的命令时内部命令还是外部命令image-20220322183641480

  4. 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做PATH,可以简单的把他理解成是”解释器的小助手”.所用是告诉Bash解释器待执行的命令可能存放的位置,然后bash解释器就会乖乖的在这些位置直接查找.PATH是由多个路径值组成的变量,每个路径之间用冒号间隔,对这些路径的增加或者删除操作都将影响到bash解释器对linux命令的查找

image-20220322184106239

为什么不能将当前目录(.)添加到PATH中呢?原因是黑客在比较常用的公共目录/tmp中存放了一个与ls或者cd命令同名的木马文件,只要在这里执行了就会中招

在接手一台linux系统之后一定会在执行命令前先检查PATH变量中是否有可疑的目录,我们可以使用env命令来查看linux系统中所有的环境变量

Linux系统中最重要的10个环境变量

变量名称 作用
HOME 用户的主目录(即家目录)
SHELL 用户在使用的Shell解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

linux作为一个多用户 多任务的操作系统,能够为每个用户提供独立的 合适的工作运行环境,因此一个相同的变量会因为用户身份的不同而具有不同的值.例如使用下述命令来查看HOME变量在不同的用户身份下都有哪些值

image-20220322184749657

直接在终端设置的变量能够立即生效,但是重启服务器之后就会立即失效,因此我们需要将变量和变量值写入到.bashrc或者.bash_profile中,以确保永久能使用他们.