3.1输入输出重定向
输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到 屏幕的数据信息写入到指定文件中。
输出重定向分为了标准输出重定向和错误输出重定向两种 不同的技术,以及清空写入与追加写入两种模式。
(base) roymustang@roymustang-GE70-2QE:~$ man ls>readme.txt
(base) roymustang@roymustang-GE70-2QE:~$ cat readme.txt
如上尝试后,发现
ls被写入readme.txt文件夹中
我们接下来尝试输出重定向技术中的覆盖写入与追加写入这两种不同模式带来的变化。首先通过覆盖写入模式向 readme.txt 文件写入一行数据(该文件中包含上一个实验的 man 命令信息),然后再通过追加写入模式向文件再写入一次数据
(base) roymustang@roymustang-GE70-2QE:~$ echo "hello world" > readme.txt
(base) roymustang@roymustang-GE70-2QE:~$ cat readme.txt
hello world
发现这是覆盖的,下图是连这些
(base) roymustang@roymustang-GE70-2QE:~$ echo "hello world" > readme.txt
(base) roymustang@roymustang-GE70-2QE:~$ echo 'dadada'>>readme.txt
(base) roymustang@roymustang-GE70-2QE:~$ cat readme.txt
hello world
dadada
虽然都是输出重定向技术,但是不同命令的标准输出和错误输出还是有区别的。例如查看当前目录中某个文件的信息,这里以 linuxprobe 文件为例。因为这个文件是真实存在的,因此使用标准输出即可将原本要输出到屏幕的信息写入到文件中,而错误的输出重定向则依然把信息输出到了屏幕上。
(base) roymustang@roymustang-GE70-2QE:~$ touch linuxstudy
(base) roymustang@roymustang-GE70-2QE:~$ ls -l linuxstudy
-rw-r--r-- 1 roymustang roymustang 0 11月 19 10:46 linuxstudy
(base) roymustang@roymustang-GE70-2QE:~$ ls -l linuxstudy>/root/strresult.txt
bash: /root/strresult.txt: 权限不够
(base) roymustang@roymustang-GE70-2QE:~$ ls -l linuxstudy>strresult.txt
(base) roymustang@roymustang-GE70-2QE:~$ cat strresult.txt
-rw-r--r-- 1 roymustang roymustang 0 11月 19 10:46 linuxstudy
可以发现发生错误不会将信息传入文本还是会继续在屏幕上显示。
如果想把命令的报错信息写入到文件,该怎么操作呢?当用户在执行一个自动化的 Shell
脚本时,这个操作会特别有用,而且特别实用,因为它可以把整个脚本执行过程中的报错信
息都记录到文件中,便于安装后的排错工作。接下来我们以一个不存在的文件进行实验演示:
(base) roymustang@roymustang-GE70-2QE:~$ ls -l ada.txt
ls: 无法访问'ada.txt': 没有那个文件或目录
(base) roymustang@roymustang-GE70-2QE:~$ ls -l ada.txt 2>strresult
(base) roymustang@roymustang-GE70-2QE:~$ cat strresult
ls: 无法访问'ada.txt': 没有那个文件或目录
在这里做了一个把错误信息放入文本中的方法,就是在>前面加个2
3.2 管道命令符
按下键盘上的 Shift+\键即可输入管道符,其执行格式为“命令 A | 命令 B”。管道命令符的作用也可以用一句话来概括“把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入”
找出被限制登录用户的命令是 grep “/sbin/nologin” /etc/passwd;
统计文本行数的命令则是 wc -l。
现在要做的就是把搜索命令的输出值传递给统计命令,即把原本要输出到屏幕的用户信息列表再交给 wc 命令作进一步的加工,因此只需要把管道符放到两条命令之间即可。
(base) roymustang@roymustang-GE70-2QE:~$ grep '/sbin/nologin' /etc/passwd |wc -l
33
3.4 常用的转义字符
(base) roymustang@roymustang-GE70-2QE:~$ PRICE=5
(base) roymustang@roymustang-GE70-2QE:~$ echo 'price is PRICE'
price is PRICE
(base) roymustang@roymustang-GE70-2QE:~$ echo "Price is $PRICE"
Price is 5
接下来,我们希望能够输出“Price is $5”,即价格是 5 美元的字符串内容,但碰巧美元符号与变量提取符号合并后的$$作用是显示当前程序的进程 ID 号码,于是命令执行后输出的内容并不是我们所预期的:
(base) roymustang@roymustang-GE70-2QE:~$ echo "Price is $$PRICE"
Price is 6026PRICE
要想让第一个“$”乖乖地作为美元符号,那么就需要使用反斜杠()来进行转义,将这个命令提取符转义成单纯的文本,去除其特殊功能。
(base) roymustang@roymustang-GE70-2QE:~$ echo "Price is \$$PRICE"
Price is $5
而如果只需要某个命令的输出值时,可以像命令
这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与 uname -a 命令结合,然后使用 echo 命令来查看本机的 Linux 版本和内核信息:
(base) roymustang@roymustang-GE70-2QE:~$ echo `uname -a`
Linux roymustang-GE70-2QE 5.4.0-53-generic #59~18.04.1-Ubuntu SMP Wed Oct 21 12:14:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
总结
总结一下一共有三种引号
"xxxxx"表示里面如果有变量按变量处理
'xxxxx’表示内部都按字符串处理
`xxxx`表示直接当命令
3.5重要环境变量
变量是计算机系统用于保存可变值的数据类型。在 Linux 系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
简单来说,命令在 Linux 中的执行分为 4 个步骤
这里有比较经典的问题:“为什么不能将当前目录(.)添加到 PATH 中呢? ” 原因是,尽管可以将当前目录(.)添加到 PATH 变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp 中存放了一个与 ls 或 cd 命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。所以,作为一名态度谨慎、有经验的运维人员,在接手了一台 Linux 系统后一定会在执行命令前先检查 PATH 变量中是否有可疑的目录,另外读者从前面的 PATH 变量示例中是否也感觉到环境变量特别有用呢。我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,精挑细选出了最重要的 10 个环境变量,如表 3-3 所示。
但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用 export 命令将其提升为全局变量,这样其他用户也就可以使用它了