Linux加强篇003-管道符、重定向与环境变量

简介: 山重水复疑无路,柳暗花明又一村

一、前言

悟已往之不谏知来者之可追实迷途其未远觉今而昨非。舟遥遥以轻飏风飘飘而吹衣。问征夫以前路恨晨光之熹微

第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《Linux就该这么学》第二版随书学习练习操作,将一些课本上不顺畅的地方,全部以最简方式免费开源展示给大家,资源大家可以自行百度,学习起来我们既要多巴胺也要内啡肽。

这两天异常的疲惫,但是也是鼓起勇气继续更新,天冷加衣,希望大家注意身体。为什么要写运维的东西呢,因为是云计算云服务器的基础,感觉是在给自己和大家提醒,不要觉得事情本来就如同你看到的那么简单,有的时候还是要看一下原理。延伸一下在校的也要提前展望一下将来——思危,在职的还是要学一些东西的——思退,失业的也可以补充一下自己——思变,以后都要进入职场的大熔炉里,在其位谋其政,同时思危、思退、思变。同样一首天王的歌送给大家<周杰伦-以父之名>,希望大家继续努力搬砖学习!

3.1 输入输出重定向

输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。

标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。

错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

[root@bogon ~]# ll test2

-rw-r--r--. 1 root root 48 Nov  8 15:25 test2

[root@bogon ~]# ll test3

ls: cannot access 'test3': No such file or directory

输入重定向中符号及作用

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

输入重定向中符号及作用

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

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

[root@bogon ~]# man bash > bash.txt

[root@bogon ~]# head -n 3 bash.txt  

BASH(1)                                            General Commands Manual                                           BASH(1)

NAME

[root@bogon ~]#  

覆盖写入模式向文件中写入数据时,每一次都会覆盖掉上一次写入的内容,所以最终文件中只有最后一次的写入结果:

[root@bogon ~]# echo "i like linux" > bash.txt

[root@bogon ~]# head -n 1 bash.txt  

i like linux

[root@bogon ~]#  

通过追加写入模式向bash.txt文件写入一次数据:

[root@bogon ~]# head -n 2 bash.txt  

i like linux

i love linux

[root@bogon ~]#  

标准输出将原本要输出到屏幕的信息写入到文件中:

[root@bogon ~]# ll bash.txt 2> test2

-rw-r--r--. 1 root root 26 Nov 10 15:34 bash.txt

不区分标准输出和错误输出,只要命令有输出信息则全部追加写入到文件中:

[root@bogon ~]# ll bash.txt &>> test2

[root@bogon ~]# ll bash1.txt &>> test2

[root@bogon ~]# cat test2

-rw-r--r--. 1 root root 26 Nov 10 15:34 bash.txt

ls: cannot access 'bash1.txt': No such file or directory

使用输入重定向把bash.txt文件导入给wc -l命令,统计一下文件中的内容行数(只读取信息流数据):

[root@bogon ~]# wc -l < bash.txt  

2

3.2 管道命令符

执行格式为“命令A | 命令B”。管道命令符的作用也可以用一句话概括为“把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入”

找出被限制登录用户的命令是grep /sbin/nologin /etc/passwd和统计文本行数的命令则是wc -l,将两条命令通过管道合并:

[root@bogon ~]# grep /sbin/nologin /etc/passwd | wc -l

42

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

[root@bogon ~]# ll /etc/ | more

drwxr-xr-x.  2 root root        34 Nov  6 11:30 cupshelpers

drwxr-xr-x.  4 root root        78 Nov  6 11:27 dbus-1

drwxr-xr-x.  4 root root        31 Nov  6 11:28 dconf

drwxr-xr-x.  2 root root        33 Nov  6 11:36 default

drwxr-xr-x.  2 root root        40 Nov  6 11:29 depmod.d

--More--

用一条命令来完成密码重置操作:

[root@bogon ~]# echo "123" | passwd --stdin root

Changing password for user root.

passwd: all authentication tokens updated successfully.

ps、grep、管道符三者结合到一起使用了。下面搜索与bash有关的进程信息:

[root@bogon ~]# ps aux | grep bash

root        1051  0.0  0.1  26244  2324 ?        S    15:02   0:00 /bin/bash /usr/sbin/ksmtuned

root        2346  0.0  0.3  27688  5708 pts/0    Ss   15:03   0:00 -bash

root        2964  0.0  0.0  12136  1148 pts/0    S+   15:58   0:00 grep --color=auto bash

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

[root@bogon ~]# ps aux | grep bash | tee result.txt

root        1051  0.0  0.1  26244  2324 ?        S    15:02   0:00 /bin/bash /usr/sbin/ksmtuned

root        2346  0.0  0.3  27688  5708 pts/0    Ss   15:03   0:00 -bash

root        3056  0.0  0.0  12136  1036 pts/0    S+   16:05   0:00 grep --color=auto bash

[root@bogon ~]# cat result.txt  

root        1051  0.0  0.1  26244  2324 ?        S    15:02   0:00 /bin/bash /usr/sbin/ksmtuned

root        2346  0.0  0.3  27688  5708 pts/0    Ss   15:03   0:00 -bash

root        3056  0.0  0.0  12136  1036 pts/0    S+   16:05   0:00 grep --color=auto bash

3.3 命令行的通配符

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

Linux系统中通配符及含义

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

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

[root@bogon ~]# ll /dev/nvm*

crw-------. 1 root root 244, 0 Nov 10 15:02 /dev/nvme0

brw-rw----. 1 root disk 259, 0 Nov 10 15:02 /dev/nvme0n1

brw-rw----. 1 root disk 259, 1 Nov 10 15:02 /dev/nvme0n1p1

brw-rw----. 1 root disk 259, 2 Nov 10 15:02 /dev/nvme0n1p2

brw-rw----. 1 root disk 259, 3 Nov 10 15:02 /dev/nvme0n1p3

只想查看文件名以nvme0n1p开头,但是后面还紧跟其他某一个字符的文件的相关信息:

[root@bogon ~]# ll /dev/nvme0n1p?

brw-rw----. 1 root disk 259, 1 Nov 10 15:02 /dev/nvme0n1p1

brw-rw----. 1 root disk 259, 2 Nov 10 15:02 /dev/nvme0n1p2

brw-rw----. 1 root disk 259, 3 Nov 10 15:02 /dev/nvme0n1p3

批量创建文件:

[root@bogon ~]# touch {AA,BB,CC}.conf

[root@bogon ~]# ll *.conf

-rw-r--r--. 1 root root 0 Nov 10 16:17 AA.conf

-rw-r--r--. 1 root root 0 Nov 10 16:17 BB.conf

-rw-r--r--. 1 root root 0 Nov 10 16:17 CC.conf

3.4 常用的转义字符

4个最常用的转义字符

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符。

单引号(' '):转义其中所有的变量为单纯的字符串。

双引号(" "):保留其中的变量属性,不进行转义处理。

反引号(` `):把其中的命令执行后返回结果。

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

[root@bogon ~]# PRICE=5

[root@bogon ~]# echo "price is $PRICE"

price is 5

特殊符号提取转义成单纯文本:

[root@bogon ~]# echo "Price is \$$PRICE"

Price is $5

反引号与uname -a命令结合,使用echo命令来查看本机的Linux版本和内核信息:

[root@bogon ~]# echo `uname -a`

Linux bogon 4.18.0-348.el8.x86_64 #1 SMP Tue Oct 19 15:14:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

3.5 重要的环境变量

变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,命令则都是小写的,命令在Linux中的执行分为4个步骤。

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

第2步Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。

用alias命令来创建一个属于自己的命令别名,语法格式为“alias别名=命令”

若要取消一个命令别名,则是用unalias命令,语法格式为“unalias别名”

第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。

可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令:

[root@bogon ~]# type echo

echo is a shell builtin

[root@bogon ~]# type uptime

uptime is /usr/bin/uptime

第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。

[root@bogon ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@bogon ~]# PATH=$PATH:/root/bin

[root@bogon ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

作为一名态度谨慎、有经验的运维人员,在接手一台Linux系统后一定会在执行命令前先检查PATH变量中是否有可疑的目录。

最重要的10个环境变量

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

查看HOME变量在不同的用户身份下都有哪些值:

[root@bogon ~]# echo $HOME

/root

[root@bogon ~]# su - centos8

Last login: Tue Nov  7 08:58:40 CST 2023 on pts/0

[centos8@bogon ~]$ echo $HOME

/home/centos8

设置一个名称为WORKDIR的变量,方便用户更轻松地进入一个层次较深的目录:

root@bogon ~]# mkdir /home/workdir

[root@bogon ~]# WORKDIR=/home/workdir

[root@bogon ~]# cd $WORKDIR

[root@bogon workdir]# pwd

/home/workdir

变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用:

[root@bogon workdir]# su centos8

[centos8@bogon workdir]$ cd $WORKDIR

[centos8@bogon ~]$ echo $WORKDIR

[centos8@bogon ~]$ exit

使用export命令将其提升为全局变量:

[root@bogon workdir]# export WORKDIR

[root@bogon workdir]# su centos8

[centos8@bogon workdir]$ cd $WORKDIR

[centos8@bogon workdir]$ pwd

/home/workdir

不使用这个变量了,则可执行unset命令把它取消掉:

[root@bogon workdir]# unset WORKDIR

[root@bogon workdir]#  

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

二、巩固练习

1.把ls命令的正常输出信息追加写入到error.txt文件中的命令是什么?

答:ls >> error.txt(注意区分>和>>的不同)。

2.请简单概述管道符的作用。

答:把左面(前面)命令的输出值作为右面(后面)命令的输入值以便进一步处理信息。

3.Bash解释器的通配符中,星号(*)代表几个字符?

答:零个或多个。

4.PATH变量的作用是什么?

答:设定解释器搜索所执行命令的路径,找到其所在位置。

5.一般情况下,为参数添加双引号有什么好处?

答:双引号通常用于界定参数的个数,以免程序或命令在执行时产生歧义,因此参数中若有空格,则建议添加双引号。

6.使用什么命令可以把名为LINUX的一般变量转换成全局变量?

答:export LINUX。

三、跋文

如果想上手操作的同学们可以通过阿里云ecs服务器免费试用参与或低价购买专属于自己的服务器入口如下

入口一:新老同学免费试用

入口二:新人服务器特惠礼包

入口三:大学生版低价特惠服务器

入口四:云服务器首购特惠&免费试用

入口五:云服务器特惠1.5折起

入口六:低价特惠建站

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
65 4
|
4月前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
193 3
|
4月前
|
存储 Linux 数据处理
在Linux中,什么是管道操作,以及如何使用它?
在Linux中,什么是管道操作,以及如何使用它?
|
4月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
81 0
|
4月前
|
消息中间件 Linux
Linux0.11 管道(十一)
Linux0.11 管道(十一)
33 0
|
4月前
|
Linux Shell
在Linux中,如何设置环境变量?
在Linux中,如何设置环境变量?
|
4月前
|
数据挖掘 Linux 应用服务中间件
在Linux中,如何在Linux中使用管道?
在Linux中,如何在Linux中使用管道?
|
4月前
|
Shell Linux
在Linux中,什么是环境变量?如何设置和查看环境变量?
在Linux中,什么是环境变量?如何设置和查看环境变量?
|
4月前
|
存储 Linux 数据处理
在Linux中,管道(pipe)和重定向(redirection)的是什么?
在Linux中,管道(pipe)和重定向(redirection)的是什么?
|
7月前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】⭐ Linux 取消或删除已设置的环境变量 unset命令 使用指南
【Shell 命令集合 系统设置 】⭐ Linux 取消或删除已设置的环境变量 unset命令 使用指南
276 0