Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Shell脚本管道符与重定向

Shell脚本管道符与重定向

作者头像
全栈工程师修炼指南
发布于 2020-10-26 03:34:02
发布于 2020-10-26 03:34:02
1.9K200
代码可运行
举报
运行总次数:0
代码可运行

[TOC]

0x00 快速入门

主要介绍管道符与输出重定向的基础知识

1. 多命令执行

多命令顺序执行符列表

多命令执行符

格式

作用

;

命令1 ; 命令2

多个命令顺序执行,命令之间没有任何逻辑联系

&&

命令1 && 命令2

逻辑与,命令1正确执行才会执行命令2,命令1不正确执行,则命令2不会执行

shift+\shift+\ =ll

命令1 ll 命令2

逻辑或,当命令1执行不正确,则命令2才会执行,当命令1正确执行,则命令2不会执行。注释:其中shift+\意味着

例如:date ; tar -zcvf etc.tar.gz /etc ; date可以计算中间打包压缩命令执行的耗时 再如:ls && echo yes || echo no,第一个命令正确执行,输出yes,错误执行输出no

2. 管道符

命令格式: 命令1 | 命令2,有一定的编程思想在里面 命令1的正确输出作为命令2的操作对象,和逻辑与不一样

实际案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ls -l /etc | more   #代表将ls -l /etc的输出分屏显示
netstat -an | grep ESTABLISHED   #代表搜索netstat -an输出中带有ESTABLISHED的行
netstat -an | grep ESTABLISHED | wc -l   #此为多管道符命令,代表到最后统计带有ESTABLISHED的行的数目,即可看出服务器上连接了多少人
3. 标准输入输出

linux启动后会默认打开3个文件描述符:

设备

设备文件名

类型

文件描述符

内存文件名

使用符号

键盘

/dev/stdin

标准输入/读取数据

0

/proc/self/fd/0

使用 < 或 <<

显示器

/dev/stdout

标准输出数据

1

/proc/self/fd/1

使用 > 或 >>

显示器

/dev/stderr

标准错误输出

2

/proc/self/fd/2

使用 2> 或 2>>

一条shell命令执行,都会继承父进程的文件描述符因此,所有运行的shell命令,都会有默认3个文件描述符。 即对于任何一条linux 命令执行它会是这样一个过程:

先有一个输入:输入可以从键盘,也可以从文件得到 命令执行完成:成功了就会把成功结果输出到屏幕:standard output默认是屏幕 命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕

WeiyiGeek.标准输入输出

(1)输出重定向

类型

符号

作用

标准输出重定向

命令 > 文件

以覆盖的方式,把命令的正确的输出,输出到指定文件或者设备中

标准输出重定向

命令 >> 文件

以追加的方式,把命令的正确输出,输出到指定文件或者设备之中

标准错误输出重定向

错误命令 2 > 文件

以覆盖的方式,把命令的错误的输出,输出到指定文件或者设备中

标准错误输出重定向

错误命令 2 >> 文件

以追加的方式,把命令的错误输出,输出到指定文件或者设备之中

(2)正确和错误输出同时保存

类型

符号

作用

正确输出和错误输入同时保持

命令 > 文件 2>&1 或者 命令 &> 文件

以覆盖方式,把suc与err输出都保存到同一个文件中

命令 >> 文件 2>&1 或者 命令 &>> 文件

以追加方式,把suc与err输出都保存到同一个文件中+

命令 >> suc文件 2>>err文件

把正确的输出追加到文件1中,把错误的输出追加到文件2中

实际示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#语法案例
command-line1 [0-2] > file   #0,1,2文件描述符或&设备/dev/null
&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符

#示例1.这个例子是讲,我们执行了任意命令,并输出到/dev/sda。
#这样的话/dev/sda 里面的文件会被命令输出的内容全部替换掉,最后丢失掉其中原有的数据。
$任意命令 > /dev/sda
ifconfig > ~/desktop/test.log     ##将内容保存在日志文件中


#示例2.正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt
# 1>可以省略不写,默认所至标准输出
$ls test.sh test1.sh
ls: test1.sh: 没有这个文件和目录
test.sh


#示例3.把错误输出到err.txt,正确输出到suc.txt中
$ls test.sh test1.sh 1>suc.txt 2> err.txt # 2>是将错误输出到文件
$cat suc.txt err.txt
test.sh
ls: 无法访问test1.sh: 没有那个文件或目录
# 继续追加把输出写入suc.txt err.txt  “>>”追加操作符
$ls test.sh test1.sh 1>>suc.txt 2>>err.txt 


#示例4.#&代表标准输出错误输出,将所有标准输出与错误输出 输入到/dev/null文件或者file.txt文件中.
$ls test.sh test1.sh &>/dev/null  #及屏蔽stdout与stderr
$ls test.sh test1.sh >/dev/null 2>&1  #将错误输出2绑定给正确输出1,然后将正确输出发送给/dev/null设备这种常用

$ls test.sh test1.sh &>file.txt


#示例5.将错误输出信息关闭掉
$ls test.sh test1.sh 2>&-
test.sh
$ls test.sh test1.sh 2>/dev/null
test.sh
# 关闭所有输出
$ls test.sh test1.sh  1>&- 2>&-  #关闭 12 文件描述符

注意事项:

  • 特别注意错误输出大于号和文件之间不能有空格!!!
  • 1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件,不存在直接创建, 无论左边命令执行是否成功,右边文件都会变为空
  • 2、“>>”操作符,判断右边文件,如果不存在就先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为[1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定
  • 3、当命令:执行完,绑定文件的描述符也自动失效0,1,2又会空闲
  • 4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符
  • 5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

(3)输入重定向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#基础语法
command-line [n] <file   ##0,1,2文件描述符或&设备/dev/null

n >& m	将输出文件 m 和 n 合并
n <& m	将输入文件 m 和 n 合并

实际案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#示例1. 和输出重定向一样,Unix 命令也可以从文件获取输入,语法为: 
$cat < catfile   #按下 [ctrl]+d 离开 
testing 

#示例2.从标准输入【键盘】获得数据,然后输出给catfile文件
$cat > file

#示例3.cat 从test.sh 获得输入数据,然后输出给文件catfile
cat >catfile <test.sh

WeiyiGeek.示例2/3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#示例4.用的最多输入重定向到文件
$cat >catfile <<eof
test a file
test!
eof
##<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,>输入多行数据后按ctrl+D结束写入


#示例5.输入重定向描述符的妙用
$wc < test.log  #wc命令原本的输入是键盘,现在重新定向为文件,当然,其实不需要<
1  3 54 #行数 单词数 字节数
#下面它会要求你不断输入,知道再遇到ddy,就会停止并做相关统计,实际工作中基本不会用到.
$wc <<ddy >test.log
  This is a input content;
ddy

$cat test.log
1  5 27
#还能将将字符统计的输入到Test.log中(可以无先)

补充知识点:

  • EOF字符前面可以采用一个-,后面连接的EOF结束字符不用一定在首行(但是需要采用Tab键功能进行缩进)
4. exec 命令

描述:在上面讲的输入输出重定向,是将输入输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后,接下来的所有命令都支持的话,就需要用exec命令来绑定重定向;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#基础语法
exec 文件描述符[n] <> file或文件描述符或设备

实际案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#示例1.将标准输出与fd 6绑定
$exec 6>&1
$ls /proc/self/fd/  
0  1  2  3  6  #出现文件描述符6


#示例2.将命令标准输出绑定到suc.txt文件中(输出到该文件)
$exec 1>suc.txt
ls -al  ##执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了
$exec 1>&6  ##恢复标准输出


#示例3.关闭fd 6描述符
#说明:使用前先将标准输入保存到文件描述符6,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。
#然后对标准输出绑定到文件,接下来所有输出都会发生到文件使用完后,恢复标准的输出,关闭打开文件描述符6。
$exec 6>&-
$ls /proc/self/fd/
0  1  2  3

#示例4.exec执行如果命令是执行一次后就退出,如果命令是一直在前台执行的情况下会持续执行;
$exec ps aux
root      84387  0.0  0.0 155372  1868 pts/0    Rs+  09:22   0:00 ps aux

WeiyiGeek.删除文件描述符

补充知识点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#故障案例1
可能有朋友会这样用:exec 1>suc.txt ,接下来所有输出都绑定到suc.txt 文件
exec 1>&2 #恢复采用错误输出 ,1 >& 2 意思是将标准输出重定向到句柄2错误输出


#故障案例2
#打开test.sh可读写操作与文件描述符3绑定
exec 3<>test.sh
while read line<&3
 do
    echo $line; #循环读取文件描述符3(读取的是test.sh内容)
done

#关闭文件的输入、输出绑定
exec 3>&-
exec 3<&-
>& 将一个句柄的输出写入到另一个句柄的输入中
<& 从一个句柄读取输入并将其写入到另一个句柄输出中


#故障案例3: 直接采用exec来进行绑定
exec<a.log
while read line
do
  echo $line
done

总结重定向应用通常就以下两点:

  • 1、重新设置命令的默认输入、输出,指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件)
  • 2、扩展自己新的描述符,对文件进行读写操作

0x02 高级管道命令
<<EOF

描述:Here Document(”嵌入文档“)是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<< delimiter	将开始标记 delimiter 和结束标记 delimiter 之间的内容作为输入,当遇到 delimiter则结束输入

#它的作用是将两个 delimiter(分隔符号)之间的内容(document) 作为输入传递给 command.
command << delimiter
     document
delimiter

实际案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#示例1.下面的例子,通过 wc -l 命令计算 document 的行数:
$wc -l << EOF
    This is a simple lookup program
    for good (and bad) restaurants 餐厅
    in Cape Town.
EOF


#示例2.在shell脚本中进行使用
#!/bin/bash
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF


#实例3.通过管道与应用交交互
FTP_SERVER=ftp.n1.dabian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom
REMOTE_FILE=debian-cd_info.tar.gz
# -n: inhibit auto-login
ftp -n << EOF
open $FTP_SERVER
user anonymous [email protected]
cd $FTP_PATH
hash
get $REMOTE_FILE
bye
EOF
ls -l $REMOTE_FILE

注意:

  • 开始的delimiter前后的空格会被忽略掉\
  • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进
mkfifo 模块

mkfifo 使用指定的文件名创建FIFO(也称为”命名管道”),它是一种特殊的文件类型,它允许独立的进程通讯(反弹Shell你懂的) 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行. 默认情况下,创建的FIFO的模式为0666(‘a+rw’)减去umask中设置的位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#基础语法
mkfifo [options] file

#选项
-m mode, --mode=mode:设置创建的FIFO的模式为 mode, 这可以是 chmod(1) 中的符号模式,并使用默认模式作为起始点,其实就是rwx权限
GNU STANDARD OPTIONS(GNU标准选项)
--help:在标准输出上打印一条用法信息,并以成功状态退出.
--version:在标准输出上打印版本信息,然后以成功状态退出.
--:终止选项列表.

实际案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#示例1.mkfifo -m 使用案例
mkfifo -m 777  myfifo
cat /etc/passwd > myfifo &  #将cat命令的输出作为此myfifo的输入,并放在后太运行、
[10] 6285
#再用cut命令从该myfifo中读出数据进行处理
cut -d: -f1-3 < myfifo
root:x:0
bin:x:1
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
20 条评论
热度
最新
MikRotic的UI怎么这么好看
MikRotic的UI怎么这么好看
回复回复点赞举报
文章写的真好
文章写的真好
回复回复点赞举报
博主非常专业,学习到了,非常优秀
博主非常专业,学习到了,非常优秀
回复回复点赞举报
专业
专业
回复回复点赞举报
专业
专业
回复回复点赞举报
内容详细专业,很到位!
内容详细专业,很到位!
回复回复点赞举报
牛批
牛批
回复回复点赞举报
专业~
专业~
回复回复点赞举报
经典,必须收藏
经典,必须收藏
回复回复点赞举报
文章受用,刚好解决最近遇到的一大难题,准备迁移业务网段,看来是不需要了,非常感谢👍
文章受用,刚好解决最近遇到的一大难题,准备迁移业务网段,看来是不需要了,非常感谢👍
回复回复点赞举报
加载更多
推荐阅读
编辑精选文章
换一批
RouterOS(ros)与云上VPC通过IPsec实现内网互通 - 涵盖GUI/CLI两种配置方式
ipsec诞生于20世纪90年代,迄今为止,在实现内网互通解决方案中ipsec都是较为常用的。不少网关设备都会考虑集成ipsec的能力,ros便是如此,它作为一个软路由系统,支持的ipsec算法较为完善,本文将以GUI、CLI两种方式讲解ros的ipsec配置,与云上VPC网络实现内网互通。
RokasYang
2022/08/28
7.1K1
RouterOS(ros)与云上VPC通过IPsec实现内网互通 - 涵盖GUI/CLI两种配置方式
【最新】如何通过云联网和 VPN 连接实现混合云主备冗余通信?
随着云上应用不断扩展,越来越多的客户采用云联网和VPN双线冗余方式实现混合云业务双向通信,以下详细介绍如何实现:
TCS-F
2021/11/12
5.3K0
【最新】如何通过云联网和 VPN 连接实现混合云主备冗余通信?
混合云如何实现IP-Sec-VPN云联网专线实现主备内网互通?
如下图所示,用户在 VPC 和 IDC 中部署了业务,为了实现云上与云下业务交互,用户需要部署网络连接服务来实现业务互通,为实现高可用通信,部署方案如下:
TCS-F
2021/12/21
4.4K0
混合云如何实现IP-Sec-VPN云联网专线实现主备内网互通?
全面理解云上网络
作者:ronaldoliu,腾讯 IEG 后台开发工程师 公司一直在推动业务上云,同时越来越多的项目也要开始出海,对云的依赖会越来越多。但是云并不像它宣传的那么简单易用,尤其是云上网络,是大家理解云的一大阻碍。本文比较全面地梳理了云上网络的各种概念以及简要的原理,希望能够帮助大家建立一个知识索引,以备不时之需。由于本人不是云的专家,因此文章中有不对的地方也欢迎指正。 私有网络 VPC VPC 全称 Virtual Private Cloud,翻译成私有网络其实不太准确,但是它确实就是对网络资源的一种抽象。我
腾讯技术工程官方号
2022/06/20
12.2K1
全面理解云上网络
通过VPN连接到VPC
默认情况下,云上创建vpc中的cvm等资源无法直接和云下IDC直接进行通信。如有此类需求的场景,可通过以下几种方式进行联通【VPN、专线】。
pinkcchen
2020/10/27
7.6K0
通过VPN连接到VPC
借助SSL VPN打通两个客户端内网
1. 腾讯云目前支持的SSL VPN协议只有UDP,暂不支持TCP;按照如下步骤填写本端网段(要打通的VPC网段)和对端网段(客户端内网网段),填写端口、认证算法、加密算法等信息:
小小果
2023/10/20
8620
腾讯云VPC网络最佳实践 - 网络规划
私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为在云上的专属网络空间,可以通过软件定义网络的方式管理私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。
杨泽华
2019/01/08
26.4K3
腾讯云VPC网络最佳实践 - 网络规划
腾讯云最佳实践-在腾讯云和AzureChina之间建立VPN连接
文章介绍:在两个公有云之间建议VPN连接,保证了公有云之间流量传输走内网走,增强了网络安全性,减少了攻击面
root0day
2022/11/25
8.8K0
TEZ API 文档
腾讯云计算产品团队
2023/07/26
5810
腾讯云高可用网络的修炼之道
当他睡眼惺忪、手拿红牛、嘴刁香烟迈着沉重的步伐从某网络核心机房走出来的时候,除了看门大爷简短问候之外,也只有刚刚过去的这个黑夜才真正懂得刚刚发生了什么,在外人眼里,这个夜晚再正常不过,和往常一样,刷刷微博、看看抖音,逛逛购物网站,即便是前一晚上有某些人觉得打开购物网站的页面有点卡慢,他们也可能不会放在心上,然而正是因为这样一个不一样的网络体验,网络工程师们已经是废寝忘食,鏖战了整整一夜,来修复引发这个网络卡慢的bug,在外人眼里一觉醒来,看似波澜不惊,但有时实则是暗流涌动;
abelbai
2020/10/31
12.4K2
腾讯云高可用网络的修炼之道
腾讯混合云网络设计白皮书
从1999年,公认的云计算先驱-Saleforce.com公司成立,到2006年,Amazon发布了名声大噪的EC2(Elastic Compute Cloud),首次面向公众提供基础架构的云服务产品-IaaS,中间经历了七年的时间。
abelbai
2023/04/26
4.2K1
腾讯混合云网络设计白皮书
在CentOS上使用strongSwan搭建IPsec V P N服务
客户业务在往腾讯云迁移的过程中,因为两边的数据需要同步,所以需要建立站点到站点的IPsec V**连接,由于某些公司没有V**设备或者其他云不支持V** Gateway产品的时候,就需要我们自己搭建IPsec V**服务。
Vicwan
2019/09/12
24.1K0
在CentOS上使用strongSwan搭建IPsec V P N服务
私有网络(VPC)
本节主要为那些具备一定计算机基础知识和网络知识的同学,能够快速的了解腾讯云的“私有网络”产品。
研究僧
2020/06/13
10.9K0
策略型VPN对接strongswan
参考https://cloud.tencent.com/document/product/554/52861
pinkcchen
2023/06/07
1.6K0
网络产品使用场景及各种坑规避
子区:类似于广州一区、广州二区这种,一个地域含有多个子区,对应于aws就是zone;
用户7316624
2020/07/17
6.4K0
网络产品使用场景及各种坑规避
在linux服务器上使用strongswan自建ipsecV**网关实现IDC与云的内网通信配置实例
    公有云技术已经非常成熟,各行各业都在上云。有的客户本身有自建IDC,想实现数据迁移或者公有云+本地IDC混合云运行模式,就需要打通IDC与公有云之间的内网,目前腾讯云有两个方案:
elliswu
2019/06/25
8.6K7
使用爱快连接腾讯云VPN网关,打通企业内网与云上VPC
云上操作 创建VPC [fc5821dfcbdb49c7bc455e53b78ea623.png] 确保私有网络的IP与本地的内网IP不冲突 创建VPN网关 [471f13e8e26d89f0af572e55f07201a6.png] 选择刚才创建的VPC 创建对端网关 [4203c1e6cd7b9d92dd380fedb8553b40.png] 这里填写本地的固定外网IP 创建VPN通道 基本配置 [ddb2f7d83b91bb6843dd7bf4bce9a7b5.png] 这三个就选刚才创建的三个产品
用户8851537
2021/08/27
10.7K1
玩转腾讯云-云上网络实操
本文带大家一起通过实操方式来学习腾讯云私有网络管理,通过弹性公网IP、NAT网关访问Internet,通过安全组、ACL进行网络访问控制。对等连接、云联网实现跨地域网络访问等网络互联实操请参阅:玩转腾讯云-网络互联实操。
hsp
2022/05/15
8.5K0
【最佳实践】TKE与现有网络互通的千层姿势
云上越来越多业务部署在容器环境,腾讯云容器环境TKE如何现有网络互通呢?最近和Z客户容器新网段和现有网络集成案例进行小结,让云上用户更好的TKE网络集成各种姿势。
开元
2020/05/23
4.8K1
【最佳实践】TKE与现有网络互通的千层姿势
Cisco路由器之IPSec 虚拟专用网(内附配置案例)
一、虚拟专用网的定义 虚拟专用网就是在两个网络实体之间建立的一种受保护的连接,这两个实体可以通过点到点的链路直接相连,但通常情况下他们会相隔较远的距离。
小手冰凉
2019/11/07
3.1K1
推荐阅读
相关推荐
RouterOS(ros)与云上VPC通过IPsec实现内网互通 - 涵盖GUI/CLI两种配置方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验