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 | 保存的历史命令记录条数 |
| 邮件保存路径 | |
| LANG | 系统语言、语系名称 |
| RANDOM | 生成一个随机数字 |
| PSI | Bash解释器的提示符 |
| PATH | 定义解释器搜索用户执行命令的路径 |
| EDITOR | 用户默认的文本编辑器 |
相关文章:
linux 管道符、重定向与环境变量
1. 输入输出重定向 在linux工作必须掌握的命令一文中,我们已经掌握了几乎所有基础常用的Linux命令,那么接下来的任务就是把多个命令适当的组合到一起,使其协同工作,会更高效的处理数据,做到这一点就必须搞清楚命令的输…...
Ansible fetch模块详解:轻松从远程主机抓取文件
在自动化运维的过程中,我们经常需要从远程主机下载文件到本地,以便进行分析或备份。Ansible的fetch模块正是为了满足这一需求而设计的,它可以帮助我们轻松地从远程主机获取文件,并将其保存到本地指定的位置。在这篇文章中…...
wireshark工具简介
目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…...
51单片机——按键控制LED流水灯
引言 在电子制作和嵌入式系统学习中,51 单片机是一个经典且入门级的选择。按键控制 LED 流水灯是 51 单片机的一个基础应用,通过这个实例,我们可以深入了解单片机的输入输出控制原理。 51 单片机简介 51 单片机是对所有兼容 Intel 8051 指…...
【opencv】第9章 直方图与匹配
第9章 直方图与匹配 9.1 图像直方图概述 直方图广泛运用于很多计算机视觉运用当中,通过标记帧与帧之间显著的边 缘和颜色的统计变化,来检测视频中场景的变化。在每个兴趣点设置一个有相近 特征的直方图所构成“标签”,用以确定图像中的兴趣点。边缘、色…...
HTML5 Web Worker 的使用与实践
引言 在现代 Web 开发中,用户体验是至关重要的。如果页面在执行复杂计算或处理大量数据时变得卡顿或无响应,用户很可能会流失。HTML5 引入了 Web Worker,它允许我们在后台运行 JavaScript 代码,从而避免阻塞主线程,保…...
MVCC底层原理实现
MVCC的实现原理 了解实现原理之前,先理解下面几个组件的内容 1、 当前读和快照读 先普及一下什么是当前读和快照读。 当前读:读取数据的最新版本,并对数据进行加锁。 例如:insert、update、delete、select for update、 sele…...
基于ESP32-IDF驱动GPIO输出控制LED
基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…...
【优选算法】9----长度最小的子数组
----------------------------------------begin-------------------------------------- 铁子们,前面的双指针算法篇就算告一段落啦~ 接下来是我们的滑动窗口篇,不过有一说一,算法题就跟数学题一样,只要掌握方法,多做…...
LabVIEW太阳能照明监控系统
在公共照明领域,传统的电力照明系统存在高能耗和维护不便等问题。利用LabVIEW开发太阳能照明监控系统,通过智能控制和实时监测,提高能源利用效率,降低维护成本,实现照明系统的可持续发展。 项目背景 随着能源危机…...
MongoDB中单对象大小超16M的存储方案
在 MongoDB 中,单个文档的大小限制为 16MB。如果某个对象(文档)的大小超过 16MB,可以通过以下几种方案解决: 1. 使用 GridFS 适用场景:需要存储大文件(如图像、视频、文档等)。 原…...
三维激光扫描-用智能检测系统提升效率
当下,企业对生产效率和质量控制的要求越来越高。传统的检测方法往往难以满足高精度、快速响应的需求。三维激光扫描技术结合智能检测系统,为工业检测带来了革命性的变革。 传统检测方法的局限性 传统检测方法主要依赖于人工测量和机械检测工具…...
css遇到的一些问题
1.vw单位,在PC端vw单位是包含右侧滚轮的宽度,而在移动端不会包含滚轮的长度,在PC端运用vw单位进行居中对齐,会比实际偏左盒子偏右一点,因为内容区域并不包含滚轮。 2.运用媒体查询进行响应式布局式,媒体查询…...
【langgraph】ubuntu安装:langgraph:未找到命令
langgraph 在ubuntu24.04 参考:langgraph运行:报错: (05_ep_dev) root@k8s-master-pfsrv:/home/zhangbin/perfwork/01_ai/05_ep_dev/expert# langgraph dev langgraph:未找到命令查看langraph的安装情况 pip show langgraph...
mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。
在第一章中安装 ,启动mysql80 服务后,连接上了mysql,那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前,要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…...
小识JVM堆内存管理的优化机制TLAB
JVM(Java虚拟机)在堆内存分配空间时,TLAB(Thread Local Allocation Buffer,线程本地分配缓存区)是一种重要的内存管理优化技术。以下是对TLAB的详细解释: 一、TLAB的定义 TLAB是JVM堆内存管理…...
ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档
一、云电脑:电竞新宠崛起 在电竞游戏不断发展的今天,硬件性能成为了决定游戏体验的关键因素。为了追求极致的游戏画面与流畅度,玩家们往往需要投入大量资金购置高性能电脑。然而,云电脑技术的出现,为玩家们提供了一种…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证10)
基于Cookie传递token的主要思路是通过用户身份验证后,将生成的token保存到Response.Cookies返回客户端,后续客户端访问服务接口时会自动携带Cookie到服务端以便验证身份。之前一直搞不清楚的是服务端程序如何从Cookie读取token进行认证(一般都…...
vscode环境中用仓颉语言开发时调出覆盖率的方法
在vscode中仓颉语言想得到在idea中利用junit和jacoco的覆盖率,需要如下几个步骤: 1.在vscode中搭建仓颉语言开发环境; 2.在源代码中右键运行[cangjie]coverage. 思路1:编写了测试代码的情况(包管理工具) …...
OLED--软件I2C驱动__标准库和HAL库
一、标准库---版本一 OLED.c--标准库 #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
