20 Shell Script输入与输出

标出输入、标准输出、错误输出

一、程序的基本三个IO流

一)文件描述符

​ 任何程序在Linux系统中都有3个基本的文件描述符

在这里插入图片描述

​ 比如:

​ cd/proc/$$/fd

​ 进入当前shell程序对于内核在文件系统的映射目录中:

[root@localhost ~]# cd /proc/$$/fd
[root@localhost fd]# ll
total 0
lrwx------. 1 root root 64 Oct 14 07:22 0 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 14 07:22 1 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 14 07:22 2 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 14 08:56 255 -> /dev/pts/0

​ 文件描述符的意义:

​ 0:标准输入(stdin):0代表:/dev/stdin文件的IO

​ 1:标准输出(stdout):1代表:/dev/stdout文件的IO

​ 2:错误输出(stderr):2代表:/dev/stderr文件的IO

​ 程序已经写死,linux为我们准备了这些文件描述符,以及一些能够重定向这些文件描述符的操作方法,我们可以修改程序的默认输入/输出位置

二)重定向

​ 重定向不是命令,是bash对关键字识别后应用文件描述符指向的操作

​ 输出重定向

​ 输入重定向来自文件

​ 输入重定向来自字符串

​ 基于文件描述符操作的重定向

二、输出重定向

​ 重定向不是命令,是bash对关键字识别后应用文件描述符指向的操作

​ 格式:

​ command [1-n] > file或文件操作符或设备

​ 上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。

ls -l /:命令默认将执行结果输出到屏幕

​ ls -l / 1> ls.txt

​ 1:代表的是ls命令的文件描述符,表示的是ls的标准输出

​ >:代表的输出重定向,这里重定向到后面的ls.txt文件中

​ 文件描述符与重定向操作符之间不能出现空格,因为bash会用空白符切割字符串,有空格会认为1是一个文件

# 创建ls.txt文件
[root@localhost ~]# touch ls.txt# 将文件的标准输出,输入到ls.txt文件中
[root@localhost ~]# ls -l / 1> ls.txt# 查看文件内容
[root@localhost ~]# cat ls.txt
total 28
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
drwxr-xr-x.  20 root root 3240 Oct 14 07:20 dev
-rw-r--r--.   1 root root  400 Jul 22 20:21 dump.rdb
drwxr-xr-x.  85 root root 8192 Oct 14 07:22 etc
drwxr-xr-x.   5 root root   39 Aug 20 04:24 home
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 lib -> usr/lib
……

​ 再次执行ls -l /root 1> ls.txt命令,会发现文件ls.txt中只有/root的内容

​ 因为:>操作符是覆盖重定向

# 覆盖重定向
[root@localhost ~]# ls -l /root 1> ls.txt# 查看文件内容
[root@localhost ~]# cat ls.txt
total 0
-rw-r--r--. 1 root root   0 Oct 14 09:21 ls.txt

​ >>:是追加重定向操作符

​ 这样就能追加内容

# 追加重定向
[root@localhost ~]# ls -l /root 1>> ls.txt# 查看文件内容
[root@localhost ~]# cat ls.txt            
total 0
-rw-r--r--. 1 root root 0 Oct 14 09:22 ls.txt
total 4
-rw-r--r--. 1 root root 54 Oct 14 09:22 ls.txt

​ 注意:文件描述符在这种重定向到文件的操作中可以省略

# 省略文件描述符
[root@localhost ~]# ls -l /root > ls.txt# 省略文件描述符
[root@localhost ~]# ls -l /root >> ls.txt

ls -l / /god命令让ls显示根目录/和/god目录的内容,但是我们的系统的/目录下没有god目录

​ 输出的结果中包含可以显示内容的/的输出,和一个没有找到/god的报错输出

​ 这个报错输出就是程序的错误输出

[root@localhost ~]# ls -l / /god
ls: cannot access /god: No such file or directory
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
……

​ 如果想将错误输出重定向:

# 创建lserr.txt
[root@localhost ~]# touch lserr.txt# 将错误输出,输入到lserr.txt
[root@localhost ~]# ls -l / /god 2> lserr.txt
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
drwxr-xr-x.  20 root root 3240 Oct 14 07:20 dev
-rw-r--r--.   1 root root  400 Jul 22 20:21 dump.rdb
drwxr-xr-x.  85 root root 8192 Oct 14 07:22 etc
……# 查看保存内容
[root@localhost ~]# cat lserr.txt
ls: cannot access /god: No such file or directory

​ 追加的方式:

# 将保存内容,追加到lserr.txt
[root@localhost ~]# ls -l / /god 2>> lserr.txt
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
drwxr-xr-x.  20 root root 3240 Oct 14 07:20 dev
……# 查看文件内容
[root@localhost ~]# cat lserr.txt
ls: cannot access /god: No such file or directory
ls: cannot access /god: No such file or directory

​ 分别将输出重定向到不同的文件中

# 将输出结果分别覆盖输入到文件中
[root@localhost ~]# ls -l / /god 1> ls.txt 2> lserr.txt# 标准输出文件
[root@localhost ~]# cat ls.txt                         
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
……# 错误输出文件
[root@localhost ~]# cat lserr.txt                      
ls: cannot access /god: No such file or directory

​ 如果向重定向到同一个文件,这里会被覆盖,要用追加的方式:

# 将输出结果分别追加输入到文件中
[root@localhost ~]# ls -l / /god 1>> ls.txt 2>> lserr.txt# 标准输出文件
[root@localhost ~]# cat ls.txt                           
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
drwxr-xr-x.  20 root root 3240 Oct 14 07:20 dev
……# 错误输出文件
[root@localhost ~]# cat lserr.txt
ls: cannot access /god: No such file or directory
ls: cannot access /god: No such file or directory
ls: cannot access /god: No such file or directory

​ 也可以用文件描述符重定向到文件描述符

​ 语法: 文件描述符>& 文件描述符

​ 注意:>&前面必须有文件描述符,且不能有空格,后面的数字才能被认为是文件描述符

# 创建lsall
[root@localhost ~]# touch lsall.txt# 将所有输出结果,输入到lsall文件(方式1)
[root@localhost ~]# ls -l / /god > lsall.txt 2>&1# 查看内容
[root@localhost ~]# cat lsall.txt
ls: cannot access /god: No such file or directory
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
……# 将所有输出结果,输入到lsall文件(方式2)
[root@localhost ~]# ls -l / /god &> lsall.txt # 查看内容,结果相同
[root@localhost ~]# cat lsall.txt
ls: cannot access /god: No such file or directory
/:
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
drwxr-xr-x.   3 root root   18 Jul 20 21:45 data
……

三、输入重定向

一)来自文件

​ read命令:

# 获取键盘输入
[root@localhost ~]# read var01
abc# 查看
[root@localhost ~]# echo $var01
abc

​ read命令开启输入流,遇到换行符结束输入,将输入流的内容赋值给变量

[root@localhost ~]# read var 0< /etc/profile# 查看变量
[root@localhost ~]# echo $var
# /etc/profile

​ 我们修改了read命令的输入源,使其来自文件,但是因为read命令的自身特征,读取第一行后遇到换行符,所以,只将第一行内容保存到变量var中

​ 0<:0是标准输入的文件描述符,<是输入重定向操作符,后面要接文件

二)来自字符串

​ 将字符串放入输入流

# 输入hello world
[root@localhost ~]# read var03 <<< "hello world"# 查看输出内容
[root@localhost ~]# echo $var03                 
hello world

​ <<<:是输入重定向操作符,将命令的输入源重定向为操作符后面的字符串

[root@localhost ~]# vi test.sh
#!/bin/bash
echo "----------"
cat <<EOF
hello world
hello linux
EOF
echo "---------"[root@localhost ~]# bash test.sh   
----------
hello world
hello linux
---------

​ <<:是重定向操作符,其后紧随的字符串为边界字符串,与结束的边界字符串组合,将其中的内容放入命令的标准输入中

​ 如果将cat换成read,依然会受到换行符的影响

三)基于文件描述符操作的重定向

​ exec命令:

​ Replace the shell with the given command.

​ bash的内部命令

[root@localhost ~]# exec ls -l /
total 24
lrwxrwxrwx.   1 root root    7 Apr 17 04:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May 15 23:07 boot
……
Connection closing...Socket close.Connection closed by foreign host.Disconnected from remote host(192.168.100.160) at 21:52:39.

​ 可以看到ls命令成功执行了,但是我们的xshell也断开了链接

​ 因为exec调用内核系统调用将ls命令的指令替换当前bash的进程,指令接收后退出进程,所以我们的bash链接就中断了

​ 这里我们可以调用exec命令,而不给出替换命令,只附加重定向操作符

​ 这样我们就可以实现对当前bash开启文件描述符

​ 这里我们可以调用exec命令,而不给出替换命令,只附加重定向操作符

​ 这样我们就可以实现对当前bash开启文件描述符

[root@localhost ~]# exec 8< /etc/profile# 输入文件描述符8
[root@localhost ~]# ls -l /proc/$$/fd
total 0
lrwx------. 1 root root 64 Oct 14 09:53 0 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 14 09:53 1 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 14 09:53 2 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 14 09:53 255 -> /dev/pts/0
lr-x------. 1 root root 64 Oct 14 09:53 8 -> /etc/profile

​ 可以看到我们的bash多了一个输入文件描述符8指向文件/etc/profile

# read输入内容
[root@localhost ~]# read var04 0<& 8# 查看内容
[root@localhost ~]# echo $var04
# /etc/profile# 用cat输入,查看内容
[root@localhost ~]# cat 0<& 8
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
……

​ 这里我们使用重定向操作符<&来复制输入文件描述符8给命令cat的标准输入0

​ 类似的输出使用>&重定向操作符

# 创建out.txt
[root@localhost ~]# touch out.txt# 定义输入文件9
[root@localhost ~]# exec 9> out.txt# 将输出结果输入到9(输入文件/root/out.txt)中
[root@localhost ~]# ls -l ./ >& 9# 查看out文件
[root@localhost ~]# cat out.txt
total 16
-rw-r--r--. 1 root root 1132 Oct 14 09:38 lsall.txt
-rw-r--r--. 1 root root  100 Oct 14 09:35 lserr.txt
-rw-r--r--. 1 root root 2164 Oct 14 09:35 ls.txt
-rw-r--r--. 1 root root    0 Oct 14 10:00 out.txt
-rw-r--r--. 1 root root   86 Oct 14 09:49 test.sh# 将错误信息输入到out中
[root@localhost ~]# ls -l /god 2>& 9# 查看
[root@localhost ~]# cat out.txt
ls: cannot access /god: No such file or directory

​ 这里再次强调重定向操作符前如果给出文件描述符,不能出现空格

# 关闭文件描述符
[root@localhost ~]# exec 8<&-[root@localhost ~]# exec 9<&-

​ 以上是关闭文件描述符

# 将输出信息,输入到out中
[root@localhost ~]# ls -l /god >& 9# 输出错误,把9作为文件,在当前目录创建了9
[root@localhost ~]# ls -l /god &> 9 
[root@localhost ~]# ll
total 24
-rw-r--r--. 1 root root   49 Oct 14 10:06 9
-rw-r--r--. 1 root root 1132 Oct 14 09:38 lsall.txt
-rw-r--r--. 1 root root  100 Oct 14 09:35 lserr.txt
-rw-r--r--. 1 root root 2164 Oct 14 09:35 ls.txt
-rw-r--r--. 1 root root   49 Oct 14 10:05 out.txt
-rw-r--r--. 1 root root   86 Oct 14 09:49 test.sh

​ 以上两种都是特殊写法

​ >&操作符后面有两种情况:数值/字符串

​ 数值:一定是一个有效的文件描述符

​ 字符串:代表一个有效的文件

​ 而&>操作符只能接文件

# 允许允许的命令:
[root@localhost ~]# ls -l /god >& 9
ls: cannot access /god: No such file or directory

​ 如果换成:ls-l /god &> 9,则不能将标准输出和错误输出到9的文件中

​ 所以根据自己的情况,如果明确想文件输出推荐使用&>

四、重定向综合案例—一切皆文件

/dev/tcp/www.baidu.com/80将百度的地址端口映射为文件系统路径

​ 开启文件描述符实际是对baidu的socket连接

[root@localhost ~]# exec 12<> /dev/tcp/www.baidu.com/80

​ 通过echo的标准输出,将http协议的请求头输出到12文件描述符,起始就是通过socket发送给baidu的服务器

[root@localhost ~]# echo -e "GET / HTTP/1.0\n" >& 12

​ baidu服务器的返回可用通过12文件描述符读取到

[root@localhost ~]# cat <& 12
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 9508
Content-Type: text/html
……

​ 注意,这个执行过程要快,时间长了,socket就超时断开连接了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web集群服务-代理和负载均衡

1. 概述 1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可 2. 后面如果是集群需要使用nginx负载均衡功能 2. 代理分类 代理分类方向应用正向代理用户(服务器)-->代理--->外部(某网站)服务器通过代理实现共享上网/访问公网反向代理用…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言&#xff0c;在程序中对某些代码进行标注说明&#xff0c;这就是注释的作用&#xff0c;能够大大增强程序的可读性。 注释的分类及语法 注释分为两类&#xff1a;单行注释 和 多行注释。 单行注释 只能注释一行内容&#xff0c;语法如下…

跟着小土堆学习pytorch(一)——Dataset

文章目录 一、前言二、dataset三、代码展示 一、前言 pytorch也是鸽了很久了&#xff0c;确定了下&#xff0c;还是用小土堆的教程。 kaggle获取数据集 二、dataset dateset&#xff1a;数据集——提供一种方式去获取数据及其标签 如何获取数据及其标签以及总共多少个数据…

PostgreSQL学习笔记六:模式SCHEMA

模式&#xff08;Schema&#xff09; PostgreSQL中的模式&#xff08;Schema&#xff09;是一个命名的数据库对象集合&#xff0c;包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象&#xff0c;使得同一个数据库中可以包含…

基于gewechat制作第一个微信聊天机器人

Gewe 个微框架 GeWe&#xff08;个微框架&#xff09;是一个创新性的软件开发框架&#xff0c;为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程&#xff0c;使开发者能够高效、灵活地构建和定制通信协议&#xff0c;以满足不同应用场景的需求…

JavaScript object(2)

这样的话&#xff0c;就变成只读了。

外包干了5天,技术明显退步

我是一名本科生&#xff0c;自2019年起&#xff0c;我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定&#xff0c;但日复一日的重复性工作让我逐渐陷入了舒适区&#xff0c;失去了前进的动力。两年的时光匆匆流逝&#xff0c;我却在原地踏步&#xff0c;技术没有丝毫…

Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)

0x01 漏洞概述 Qualitor 8.24及之前版本存在任意文件上传漏洞,未经身份验证远程攻击者可利用该漏洞代码执行,写入WebShell,进一步控制服务器权限。 0x02 复现环境 FOFA:app="Qualitor-Web" 0x03 漏洞复现 PoC POST /html/ad/adfilestorage/request/checkAcess…

【IC验证】随机约束

1.约束 &#xff08;1&#xff09;注意 一般随机约束只能在类中使用&#xff1b; &#xff08;2&#xff09;实现步骤 在定义变量时&#xff0c;用rand/randc关键字进行修饰&#xff1b; 定义约束&#xff1b; 创建并实例化类后&#xff0c;调用随机约束方法&#xff1b; &am…

光平面标定代码

本篇文章主要给出光平面标定代码&#xff0c;鉴于自身水平所限&#xff0c;如有错误&#xff0c;欢迎批评指正。&#xff08;欢迎进Q群交流&#xff1a;874653199&#xff09; 数据分为棋盘格数据和激光条数据&#xff0c;激光条数据为在第22个位姿至第26个位姿下打在棋盘格标定…

初识Linux之指令(二)

一&#xff1a;head指令 head 与 tail 就像它的名字一样的浅显易懂&#xff0c;它是用来显示开头或结尾某个数量的文字区块&#xff0c;head 用来显示档案的 开头至标准输出中&#xff0c;而 tail 想当然尔就是看档案的结尾。 语法&#xff1a;head 【参数】 【文件】 功能&…

開發 meshtastic 聊天機器人(2)

利用 Web 串接主機附近周邊藍芽(含 meshtastic client) pip install bleak (這個比較簡單) ----另外一個為 pybluez2 (pybluez) 2.程式 import streamlit as st import asyncio from bleak import BleakScannerasync def fetch_data():devices await BleakScanner.discover(…

京存非编存储走进中央民族大学

中央民族大学是一所具有鲜明民族特色的综合性全国重点大学&#xff0c;是国家民委、教育部、北京市共建高校。学校前身为1941年成立的延安民族学院。新中国成立后&#xff0c;经中央政府批准&#xff0c;1951年在北京成立中央民族学院&#xff0c;1993年11月更名为中央民族大学…

【量化交易】聚宽安装

安装JQData 更换源&#xff1a; 如果使用的是pip默认的PyPI源&#xff0c;可以尝试更换为一个更快的国内镜像源。例如阿里云、豆瓣等提供的PyPI镜像。 更改方法可以通过设置环境变量或者在pip命令中直接指定&#xff1a; PS C:\Users\bilirjs\Documents> pip config set …

No.13 笔记 | 网络安全防护指南:从法律法规到技术防御

一、法律法规 《中华人民共和国网络安全法》要点 遵守法律&#xff1a;所有个人和组织在使用网络时&#xff0c;必须遵守宪法和法律&#xff0c;不得利用网络从事危害国家安全等活动。 个人信息保护&#xff1a;禁止非法获取、出售或提供个人信息。若违反但未构成犯罪&#x…

Karmada核心概念

以下内容为翻译&#xff0c;原文地址 Karmada 是什么&#xff1f; | karmada 一、Karmada核心概念 一&#xff09;什么是Karmada 1、Karmada&#xff1a;开放&#xff0c;多云&#xff0c;多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…

【NTN 卫星通信】卫星通信的专利

1 概述 好久没有看书了&#xff0c;最近买了本讲低轨卫星专利的书&#xff0c;也可以说是一个分析报告。推荐给喜欢的朋友。 2 书籍截图 图1 封面 图2 波音低轨卫星专利演进 图3 低轨卫星关键技术专利发展阶段 图4 第一页 3 参考文献 产业专利分析报告–低轨卫星通信技术

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上&#xff0c;通常承载数千个服务的流量&#xff0c;对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念&#xff1a;Service&#xff0c;为多个Pod提供统一的访问入口&#xff1b;Ingress&#xff…

【火山引擎】调用火山大模型的方法 | SDK安装 | 配置 | 客户端初始化 | 设置

豆包 (Doubao) 是字节跳动研发的大规模预训练语言模型。 目录 1 安装 2 配置访问凭证 3 客户端初始化 4 设置地域和访问域名 5 设置超时/重试次数 1 安装 通过pip安装PYTHON SDK。 pip install volcengine-python-sdk[ark] 2 配置访问凭证 获取 API Key 访问凭证具体步…