linux 管道符、重定向与环境变量

1. 输入输出重定向

在linux工作必须掌握的命令一文中,我们已经掌握了几乎所有基础常用的Linux命令,那么接下来的任务就是把多个命令适当的组合到一起,使其协同工作,会更高效的处理数据,做到这一点就必须搞清楚命令的输入重定向和输出重定向的原理。

简而言之,输入重定向就是把文件导入到命令中,而输出重定向则是指把原本输出到屏幕的数据信息写入到指定文件中。在日常工作中,相较于输入重定向,输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。

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

比如我们分别查看两个文件的属性信息,其中第二个文件时不存在的,虽然针对这两个文件的操作都分别会在屏幕上输出一些数据信息,但这两个操作的差异其实很大:

[root@root test]# ls -l test1.txt
-rw-r--r--. 1 root root 8 1月  22 17:10 test1.txt
[root@root test]# ls -l test2.txt
ls: 无法访问test2.txt: 没有那个文件或目录

在上述命令中,名为test1.txt文件是存在的,输出的是该文件的一些权限、所有者、所属组、文件大小以及修改时间等信息,这也是该命令的标准输出信息,而名为test2.txt文件是不存在的,因此在执行ls 命令后显示的报错提示信息也是该命令的错误输出信息。那么,要想把原本输出到屏幕上的数据转而写入到文件当中,就要区别对待这两种输出信息。

对于输入重定向来讲,用到的符号及其作用如表:

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

对于输出重定向来讲,用到的符号以及作用如下表:

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

对于重定向中的标准输出模式,可以省略文件描述符1 不写,而错误输出模式的文件描述 2是必须要写的。我们先来小试牛刀。通过标准输出重定向将man bash 命令原本要输出到屏幕的信息写入到readme.txt中,然后显示readme.txt文件中的内容。具体命令如下:

在这里插入图片描述
有没有感觉很方便呢?我们接下来尝试输出重定向技术中的覆盖写入与追加写入这2种不同模式带来的变化。首先通过覆盖写入模式向readme.txt文件写入一行数据,然后再通过追加写入模式向文件再写入一次数据,其命令如下:

[root@root test]# echo "welcome to china!" > readme.txt
[root@root test]# echo "china is very beautiful!" >> readme.txt

在执行cat命令之后,可以看到如下所示的文件内容:

[root@root test]# cat readme.txt
welcome to china!
china is very beautiful!

虽然都是输出重定向技术,但是不同命令的标准输出和错误输出还是有区别的。例如查看当前目录中某个文件的信息,这里以readme.txt为例,因为这个文件是真实存在的,因此使用标准输出即可将原本要输出到屏幕的信息写入到文件中,而错误的输出重定向则依然把信息输出到了屏幕上。

在这里插入图片描述
如果想把命令的报错信息输出写入到文件,该怎么操作呢?当用户在执行一个自动化的Shell脚本时,这个操作会特别有用,因为它把整个脚本执行过程中的报错信息都记录到了文件中,便于安装后的排错工作,接下来我们以一个不存在的文件进行演示:


[root@root test]# ls -l xxx
ls: 无法访问xxx: 没有那个文件或目录
[root@root test]# ls -l xxx > test4.txt
ls: 无法访问xxx: 没有那个文件或目录
[root@root test]# ls -l xxx 2> test4.txt
[root@root test]# cat test4.txt
ls: 无法访问xxx: 没有那个文件或目录

输入重定向相对来说有些冷门,在工作中遇到的概率会小一点,输入重定向的作用是把文件直接导入到命令中,接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数。

[root@root test]# wc -l < readme.txt
3109 readme.txt

上述命令实际上等同于cat readme.txt | wc -l 管道符命令的组合

2. 管道命令符

管道命令符的作用可以用一句话来概括“把前一个命令原本要输出到屏幕的标准正常数据当作是最后一个命令的标准输入”,我们通过匹配关键词/sbin/nologin找出了所有被限制登录的用户。

  • 找出被限制登录用户的命令时 grep “/sbin/nologin” /etc/passwd;
  • 统计文本行数的命令则是 wc-l

把这两条命令合并为一条就是

[root@root test]# grep "/sbin/nologin" /etc/passwd | wc -l
33

这个管道符就像一个法宝,我们可以将它套用到其他不同的命令上,比如用翻页的形式查看 /etc 目录中文件列表及属性信息。

[root@root test]# ls -l /etc | more
总用量 1036
-rw-r--r--.  1 root root       16 8月  23 2022 adjtime
-rw-r--r--.  1 root root     1529 4月   1 2020 aliases
-rw-r--r--.  1 root root    12288 8月  23 2022 aliases.db
drwxr-xr-x.  2 root root      236 8月  23 2022 alternatives
-rw-------.  1 root root      541 8月   9 2019 anacrontab
-rw-r--r--.  1 root root       55 8月   8 2019 asound.conf
drwxr-x---.  3 root root       43 8月  23 2022 audisp
drwxr-x---.  3 root root       83 8月  23 2022 audit
drwxr-xr-x.  2 root root       68 1月   9 2023 bash_completion.d
-rw-r--r--.  1 root root     2853 4月   1 2020 bashrc
drwxr-xr-x.  2 root root        6 10月  2 2020 binfmt.d
-rw-r--r--.  1 root root       37 10月 23 2020 centos-release
-rw-r--r--.  1 root root       51 10月 23 2020 centos-release-upstream
drwxr-xr-x.  2 root root        6 10月 13 2020 chkconfig.d
-rw-r--r--.  1 root root     1108 8月   8 2019 chrony.conf
-rw-r-----.  1 root chrony    481 8月   8 2019 chrony.keys
drwxr-xr-x.  2 root root       25 1月   9 2023 containerd
--More--

3. 命令行通配符

大家都有遇到提笔忘记的尴尬,有时候明明 一个文件名称就在嘴边但就是想不起来,如果记得一个文件的开头几个字母,想遍历找出所有以这个关键词开头的文件,该怎么操作呢?又比如,假设想要批量批量查看所有硬盘文件的相关权限属性,一种方式是这样的:


[root@root test]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 1月  21 08:42 /dev/sda
[root@root test]# ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 1月  21 08:42 /dev/sda1
[root@root test]# ls -l /dev/sda2
brw-rw----. 1 root disk 8, 2 1月  21 08:42 /dev/sda2
[root@root test]# ls -l /dev/sda3
brw-rw----. 1 root disk 8, 3 1月  21 08:42 /dev/sda3
[root@root test]# ls -l /dev/sda4
ls: 无法访问/dev/sda4: 没有那个文件或目录

幸亏我的硬盘文件和分区只有4个,要是有几百个,估计要花一天时间来忙这个事情了,由此可见,这种方式的效率确实。比如,这些硬盘设备文件都是以sda开头并且存放到了/dev目录中,这样一来,即使我们不知道硬盘的分区编号和具体分区的个数,也可以使用通配符来搞定。顾名思义,通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的的单个数字字符,而中括号内加上字母[abc] 则是代表匹配a、b、c三个字符中任意一个字符,其实就是编程中正则表达式。

[root@root test]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 1月  21 08:42 /dev/sda
brw-rw----. 1 root disk 8, 1 1月  21 08:42 /dev/sda1
brw-rw----. 1 root disk 8, 2 1月  21 08:42 /dev/sda2
brw-rw----. 1 root disk 8, 3 1月  21 08:42 /dev/sda3

4. 常用转义字符

为了能够更好的理解用户的表达,Shell解释器还提供了特别丰富的转义字符来处理输入的特殊数据。
4个最常用的转义字符如下所示:
反斜杠(\):是反斜杠后面的一个变量变为单纯的字符串。
单引号(‘’):转义其中所有的变量为单纯的字符串。
双引号(“”):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。

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

[root@root test]# PRICE=5
[root@root test]# echo "Price is $PRICE"
price is 5

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

[root@root test]# [root@root test]# echo "price is $$PRICE"
price is 7142PRICE

要想让第一个“$” 乖乖的作为美元符号,那么就需要反斜杠(\)来进行转义,将这个命令提取符转义称单纯的文本,去除其特殊功能。

[root@root test]# [root@root test]# echo "price is \$$PRICE"
price is $5

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

[root@root test]# echo `uname -a`
Linux root 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

5. 重要的环境变量

变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
在Linux系统中一切都是文件,Linux命令也不例外,那么在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为4个步骤。
第一步: 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。
第二步: Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用 alias 命令来创建一个属于自己的命令别名,格式为 “alias 别名=命令” 。若要取消一个命令别名,则是用unalias命令,格式为:“unalias 别名”。我们之前使用rm 命令删除文件时,Linux系统都会要求我们再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删文件而特意设置的rm别名命令。


[root@root test]# alias rm
alias rm='rm -i'

第三步: Bash解释器判断用户输入的是内部命令还是外部命令。内部命令时解释器内部的命令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4处理。可以使用“type 命令名称” 来判断用户输入的命令时内部命令还是外部命令。

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

[root@root test]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/data/jdk1.8.0_341/bin:/home/data/redis/bin:/home/data/kafka_2.12-3.0.0/bin:/root/bin

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言编程笔记:文件处理的艺术

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、为什么要用文件二、文件的分…

K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观

目录标题 Lic使用感受优点&#xff1a;优化点&#xff1a; 实操首页项目 | 应用负载 | 配置 | 定制资源定义存储监控告警集群设置 **KubeSphere 3.x** 和 **4.x**1. **架构变化**&#xff1a;2. **多集群管理**&#xff1a;3. **增强的 DevOps 功能**&#xff1a;4. **监控与日…

堆的简要分析与实现(Java)

目录 开场白 顺序存储下标的关系 堆的定义 堆的实现 大顶堆 准备工作 建堆 获取最大元素 删除最大元素 删除指定索引元素 替换指定索引元素 新增元素 完整实现 & 单元测试 小顶堆 统一实现 总结 开场白 在上一篇文章中我们简要分析并实现了二叉树&#xff…

初学FreeRTOS --- 介绍

FreeRTOS介绍&#xff1a; “RTOS” 全称是 Real Time Operating System&#xff0c; 中文名就是实时操作系统&#xff0c;要注意的是&#xff0c; RTOS 并不是指某一特定的操作系统&#xff0c;而是指一类操作系统&#xff0c;例如&#xff0c; C/OS&#xff0c; FreeR…

【记录】日常|从零散记录到博客之星Top300的成长之路

文章目录 shandianchengzi 2024 年度盘点概述写作风格简介2024年的创作内容总结 shandianchengzi 2024 年度盘点 概述 2024年及2025年至今我创作了786即84篇文章&#xff0c;加上这篇就是85篇。 很荣幸这次居然能够入选博客之星Top300&#xff0c;这个排名在我之前的所有年份…

基于Django的Boss直聘IT岗位可视化分析系统的设计与实现

【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言&#xff0c;利用Django这一高效、安全的W…

神经网络|(一)加权平均法,感知机和神经元

【1】引言 从这篇文章开始&#xff0c;将记述对神经网络知识的探索。相关文章都是学习过程中的感悟和理解&#xff0c;如有雷同或者南辕北辙的表述&#xff0c;请大家多多包涵。 【2】加权平均法 在数学课本和数理统计课本中&#xff0c;我们总会遇到求一组数据平均值的做法…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现&#xff0c;详见下文&#xff1a; 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现&#xff0c;其形参均采用了…

tkinter绘制组件(44)——浮出ui控件

tkinter绘制组件&#xff08;44&#xff09;——浮出ui控件 引言布局函数结构ui框架对齐方向绑定已有控件出现和隐藏逻辑出现和隐藏动画完整代码函数 效果测试代码最终效果 github项目pip下载 引言 TinUI的浮出ui控件&#xff08;flyout&#xff09;其实是一个之间创建在UI框架…

SAP MM 记录一次SAP外协采购收货提示 这种物料的特殊库存 O 0100003359 14019002不存在的问题

根据采购订单收货&#xff0c;调用时 BAPI_GOODSMVT_CREATE时返回 { "TYPE":"E", "ID":"M7", "NUMBER":"076", "MESSAGE":"这种物料的特殊库存 O 0100003359 14019002不存在"…

noteboolm 使用笔记

今天心血来潮&#xff0c;想要体验下AInotebook&#xff0c;看看最新的软件能够做到什么程度。 于是来到了notebooklm&#xff0c;这是一个google推出的AI笔记本的网站&#xff0c;我想知道我们能在上面做一些怎么样有趣的事情&#xff01; 网址&#xff1a;https://notebookl…

【Pytest】生成html报告中,中文乱码问题解决方案

import pytestif __name__ "__main__":# 只运行 tests 目录下的测试用例&#xff0c;并生成 HTML 报告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中设置 [pytest] addopts --htmlreport.html --self-contai…

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器

一、定时器简介 STM32 中的定时器&#xff08;TIM&#xff0c;Timer&#xff09;是其最重要的外设之一&#xff0c;广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能&#xff1a;TIM定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中…

2025.1.26机器学习笔记:C-RNN-GAN文献阅读

2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目&#xff1a; C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊&#xff1a; NIPS作者&#xff1a; Olof Mogren发表时间…

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…

【数据结构】_不带头非循环单向链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 单链表的实现 3.1 SList.h头文件 3.2 SList.c源文件 3.3 Test_SList.c测试文件 关于线性表&#xff0c;已介绍顺序表&#xff0c;详见下文&#xff1a; 【数据结构】_顺序表-CSDN博客 本文介绍链表&#xff1b; 基于顺序表…

HippoRAG:受海马体启发的长时记忆模型,提升大语言模型的知识整合能力

论文地址&#xff1a;https://arxiv.org/pdf/2405.14831 1. 背景与挑战 1.1 哺乳动物大脑与长时记忆 进化优势: 哺乳动物的大脑进化出强大的长时记忆系统&#xff0c;能够存储大量关于世界的知识&#xff0c;并不断整合新信息&#xff0c;同时避免灾难性遗忘。知识整合能力: …

Juc22_什么是中断、interrupt、isInterrupted、interrupted方法源码解析、如何使用中断标识停止线程

目录 ①. 什么是中断 ②. 源码解读(中断的相关API) ③. 如何使用中断标识停止线程 ①. 什么是中断 ①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了 ②. 在Java中没有办法立即停止…

网络安全 | F5-Attack Signatures详解

关注&#xff1a;CodingTechWork 关于攻击签名 攻击签名是用于识别 Web 应用程序及其组件上攻击或攻击类型的规则或模式。安全策略将攻击签名中的模式与请求和响应的内容进行比较&#xff0c;以查找潜在的攻击。有些签名旨在保护特定的操作系统、Web 服务器、数据库、框架或应…

项目概述与规划 (I)

项目概述与规划 (I) JavaScript的学习已经接近尾声了&#xff0c;最后我们将通过一个项目来讲我们在JavaScript中学习到的所有都在这个项目中展现出来&#xff0c;这个项目的DEMO来自于Udemy中的课程&#xff0c;作者是Jonas Schmedtmann&#xff1b; 项目规划 项目步骤 用户…