Linux学习(二)
Linux学习(二)
管道符 重定向与环境变量
输入输出重定向
- 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令中输入
- 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕
比如分别查看两个文件的属性信息,我们先创建第一个文件,而第二个文件是不存在的.所以针对这两个文件的操作都分别会在屏幕上输出一些信息
上述命令中,名为1的文件是真实存在的,输出信息是该文件的相关权限 所有者 文件大小 及修改时间等信息 这也是该命令的标准输出信息 而名为xxxx 的文件本来是不存在的,因此在执行完该ls 命令之后显示的报错信息也是该命令的错误输出信息.那么想要把原本输出到屏幕上的数据转而写入文件中,就需要区别对待这两种输出信息
输入重定向中用到的符号及其作用
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输出重定向中用到的符号及其作用
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
对于重定向中的标准输出模式,可以省略文件描述符1 不写,而错误输出模式的文件描述2是必须要写的 .通过标准输出重定向将 man bash命令原本要输出到屏幕的信息写入到文件readme.txt中,然后显示该文件中的内容
接下来将使用覆盖写入与追加写入这两种不同的模式带来的变化 首先通过覆盖写入模式像readme.txt文件写入多行数据,这个命令只会剩下最后一次的
使用追加的方式向readme.txt文件写入一次数据,然后执行
虽然都是重定向,但是命令的标准输出和错误输出还是有区别的.
将错误的信息输出到文件中去
还有就是不区分标准输出和错误输出,只要命令有输出信息就追加写入到文件中.这就要用到&>>操作符了
输出重定向的作用就是把文件直接导入到命令中 接下来使用输出重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数
管道命令符
管道命令符的作用也可以概括为一句话 把前一个命令原本要输出到屏幕的信息当做后一个命令的标准输入,我们通过匹配关键字/sbin.nologin找出了所有被限制登录系统的用户
- 找出被限制登录的名称是grep /sbin/nologin /etc/passwd
- 统计文本函数的命令时wc -l
现在需要做的是把grep搜索命令的输出值传递给wc统计命令,即把原本要输出到屏幕的用户信息列表在交给wc命令做进一步的加工,因此只需要把管道符放到两条语句之间即可
比如用翻页的模式查看/etc目录中的文件列表及属性信息
在修改用户密码时,通常需要输入两次密码以进行确认,这在编写自动化脚本的时候将成为一个非常致命的缺陷,通常把管道符和passwd命令的–stdin参数相结合,可以使用一条命令来完成密码重置操作
在输入ps aux命令后屏幕上的信息呼呼闪过,看不到有用信息,现在可以将ps grep 管道符 三者结合到一起使用了 下面搜索与bash 有关的进程信息
如果需要将管道符处理后的结果既要输出到屏幕,又同时写入到文件中,则可以与tee命令相结合使用
下面的命令将显示系统中所有与bash相关的进程信息,并同时将输出到屏幕和文件中
命令行的统配符
比如,我们想要批量查看所有硬盘文件的相关权限属性.这些硬盘设备文件都是以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开头的文件
如果只是想查看文件名以sda开头,但是后面还仅跟着其他某一个字符的文件的相关信息,这时就需要用到问号来进行统配了
除了使用[0-9]来匹配0-9之间的单个数字,也可以使用[125]这样的方式仅匹配3个指定数字中的一个;若没有匹配出来就不会显现出来
通配符不一定非要放到最后,也可以放到前面,比如可以使用以下的命令来搜索/etc/目录中所有以.config为结尾的配置文件有哪些
通配符不仅可以用于搜索文件或者代替通配符的字符,还可以与创建文件命令相结合,一口气创建出多个文件.不过在创建文件的时候,需要使用大括号,并且字段之间用逗号隔开
通配符还可以输出指定的信息
常用的转义字符
常用的转义字符
- 反斜杠(\) :使反斜杠后面的一个变量变为单纯的字符
- 单引号(‘’):转义其中所有的变量为单纯的字符串
- 双引号(“”):保留其中的变量属性,不进行转义处理
- 反引号(``):把其中的命令执行后返回结果
我们先定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息
我们接下来希望能输出”Price is $5”,即”价格是5美元”的字符串内容,但碰巧美元符号与变量提取符号合并之后的$$作用是显示当前程序的进程ID号码,于是命令执行后的输出的内容弄并不是我们所预期的
想要第一个$称为美元复发,那么需要使用反斜杠(\)来进行转义,将这个命令提取符转义成单纯的文本
而如果只需要某个命令的输出值,可以像``命令一样,将命令用反引号括起来,达到预期的效果.例如,将反引号与uname -a命令结合,然后使用echo命令来查看本机的linux版本和内核信息.
反斜杠胡反引号的功能比较有特点
两者的区别在与用户无法得知第一种执行方式中到底有几个参数,因为有可能把”AA BB CC”当成一个参数整体输出到屏幕上,也有可能将AA BB CC分别输出到屏幕上
如果参数中出现了空格,就加上单引号,如果参数中没有空格,那么就不用加双引号
环境变量
变量是计算机系统用于保存可变值的数据类型,在linux系统中,变量名称一般都是大写的,命令则都是小写的,这是一种规范.linux中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录,邮件存在的位置等.可以直接通过变量的名称来提取对应的变量值.
linux中命令在执行时分为四个步骤
判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是绝对路径则直接执行,否则进入第二步继续判断
linux系统检查用户输入的命令是否为”别名命令”,即一个自定义的命令名称来提换原本的命令名称之前在使用rm命令删除文件时,linux系统都会要求用户确认是否执行删除操作,其实这就是linux系统为了防止用户误删除文件而特意设置的rm别名命令 “rm -i”可以使用alias命令来创建一个属于自己的命令别名,语法格式为”alias别名=命令” 若要取消一个命令的别名,则是用unalias命令,语法
unalias 别名
Bash解释器判断用户输入的是内部命令还是外部命令.内部命令时解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理.可以使用”type命令名称”来判断用户输入的命令时内部命令还是外部命令
系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做PATH,可以简单的把他理解成是”解释器的小助手”.所用是告诉Bash解释器待执行的命令可能存放的位置,然后bash解释器就会乖乖的在这些位置直接查找.PATH是由多个路径值组成的变量,每个路径之间用冒号间隔,对这些路径的增加或者删除操作都将影响到bash解释器对linux命令的查找
为什么不能将当前目录(.)添加到PATH中呢?原因是黑客在比较常用的公共目录/tmp中存放了一个与ls或者cd命令同名的木马文件,只要在这里执行了就会中招
在接手一台linux系统之后一定会在执行命令前先检查PATH变量中是否有可疑的目录,我们可以使用env命令来查看linux系统中所有的环境变量
Linux系统中最重要的10个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
linux作为一个多用户 多任务的操作系统,能够为每个用户提供独立的 合适的工作运行环境,因此一个相同的变量会因为用户身份的不同而具有不同的值.例如使用下述命令来查看HOME变量在不同的用户身份下都有哪些值
直接在终端设置的变量能够立即生效,但是重启服务器之后就会立即失效,因此我们需要将变量和变量值写入到.bashrc或者.bash_profile中,以确保永久能使用他们.