Shell输入输出重定向

这篇具有很好参考价值的文章主要介绍了Shell输入输出重定向。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、文件描述符

英文是file descriptor简称fd。
文件描述符是一个非负整数。它是一个索引值,指向进程打开的文件。
Linux程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。
每个文件描述符会与一个打开的文件相对应。
不同的文件描述符也可能指向同一个文件。

在Linux中,每一个进程打开时都会自动获取3个文件描述符0、1和2,分别表示标准输入、标准输出、和标准错误,如果要打开其他文件,则文件描述符必须从3开始标识。

文件描述符 文件名 类型 指向硬件
0 /dev/stdin 标准输入文件 键盘
1 /dev/stdout 标准输出文件 显示器
2 /dev/stderr 标准错误输出文件 显示器
$ ll /dev/std*
lrwxrwxrwx 1 root root 15 Apr 2 07:57 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Apr 2 07:57 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Apr 2 07:57 /dev/stdout -> /proc/self/fd/1

$ ll /proc/self/fd/
total 0
lrwx------ 1 root root 64 Apr 6 03:53 0 -> /dev/pts/2
lrwx------ 1 root root 64 Apr 6 03:53 1 -> /dev/pts/2
lrwx------ 1 root root 64 Apr 6 03:53 2 -> /dev/pts/2
lr-x------ 1 root root 64 Apr 6 03:53 3 -> /proc/14038/fd

二、重定向

重定向分为两种,一种输入重定向,一种是输出重定向;
从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思。可以把重定向理解为指向。

(一)输出重定向
输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。
这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。

1.标准输出重定向

command 1>file 以覆盖的方式,把command的正确输出结果输出到file文件中。

command 1>>file 以追加的方式,把command的正确输出结果输出到file文件中。

2.标准错误重定向

command 2>file 以覆盖的方式,把command的错误信息输出到file文件中。

command 2>>file 以追加的方式,把command的错误信息输出到file文件中。

3.标准输出与标准错误同时重定向

command 1>file1 2>file2  以覆盖的方式,把正确的输出结果输出到file1文件中,把错误信息输出到file2文件中。

command 1>>file1  2>>file2 以追加的方式,把正确的输出结果输出到file1文件中,把错误信息输出到file2文件中。

command 1>file 2>file 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件file中。不推荐这种方式。

command 1>>file 2>>file 以追加的方式,把正确输出和错误信息同时保存到同一个文件file中。

注意
(1)输出重定向的完整写法是fd>file或者fd>>file,其中fd表示文件描述符,如果不写,默认为1,也就是标准输出文件。
当文件描述符为大于1的值时,比如2,就必须写上。
(2)fd和>之间不能有空格,否则Shell会解析失败;>和file之间的空格可有可无。为了保持一致,我习惯在>两边都不加空格。

4./dev/null文件
如果你既不想把命令的输出结果保存到文件,也不想把命令的输出结果显示到屏幕上,干扰命令的执行,那么可以把命令的所有结果重定向到/dev/null文件中。
大家可以把 /dev/null 当成Linux 系统的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。

command 1>/dev/null 2>/dev/null

5.用法举例

(1)标准输出重定向

echo 'hello world' >foobar.txt
cat foobar.txt

运行结果:
hello world

echo 'hello world' >>foobar.txt
cat foobar.txt

运行结果:
hello world
hello world

(2)标准错误重定向

ls foobar 2>err.log
cat err.log

运行结果:
ls: 无法访问 'foobar': 没有那个文件或目录

(3)标准输出与标准错误同时重定向

ls >out.log 2>err.log
ls foobar >>out.log 2>>err.log
cat out.log
cat err.log

(4)输出到/dev/null文件

ls foobar >/dev/null 2>/dev/null

(二)输入重定向
输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。
命令必须能接受标准输入作为参数。

1.标准输入重定向

command 0<file  将file文件中的内容作为command的输入。

2.here document
格式如下:

command 0<<delimiter
document
delimiter

Here Document是Shell中的一种特殊的重定向方式,将两个delimiter之间的内容document作为输入。

注意
delimiter可以是任意字符串。
开始的delimiter后面必须是一个换行符。
结尾的delimiter一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。

3.here string
格式如下:

command 0<<<string 将字符串string作为输入
cat <<<'hello world'

等同于

echo 'hello world' | cat

注意
输入重定向的完整写法是fd<file,其中fd表示文件描述符,如果不写,默认为0,也就是标准输入文件。

4.用法举例
(1)输入重定向
统计文档中有多少行文字。

wc -l foobar.txt
2 foobar.txt

wc -l <foobar.txt
2

上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

(2)逐行读取文件内容。

while read str; do
     echo $str
done <foobar.txt

这种写法叫做代码块重定向,也就是把一组命令同时重定向到一个文件。

(3)Here Document

wc -l <<eof
foo
bar
eof

也可以将Here Document用在脚本中,例如:

#!/bin/bash
cat <<eof
foo
bar
eof

(4)here string
批量重命名文件名含有空格的文件
重命名前:

txt 2014.02.14.log
txt 2014.02.15.log

重命名后:

txt_2014_02_14.log
txt_2014_02_15.log

脚本内容

oldifs=$IFS
IFS=$'\n'
for file in `ls`;do
     mv $file `sed -r 's/[ .]/_/g;s/(.*)_/\1./' <<< $file`
done
IFS=$oldifs

(三)输入和输出同时重定向

command 0<file1 1>file2 将file1作为command的输入,并将command的正确结果输出到file2。 

(四)文件描述符复制
文件描述符的复制是指将一个文件描述符指向另一个文件描述符指向的文件。使用”&”进行复制。

n<&m:n指向m指向的文件。作为输入

n>&m:n指向m指向的文件。作为输出

可以发现总是前面指向后面,即n指向m。
例如,3>&1表示3指向1指向的文件,1指向的文件是/dev/stdout,3也重定向到/dev/stdout,以后进程将数据写入3的时候,将直接输出到屏幕。这里的3>&1等价于3>/dev/stdout。如果后面改变了1指向的文件,由于3的目标仍然是/dev/stdout,所以可以拿3来还原1使其目标变回/dev/stdout。

为什么不用n<m与n>m呢?
因为<与>后面必须是文件名,不支持文件描述符。如果使用2>1,它会把1解释成文件名。所以就有了&,专门用来处理两个文件描述符的重定向。

command 1>file 2>&1 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件file中。

command 1>>file 2>&1 以追加的方式,把正确输出和错误信息同时保存到同一个文件file中。

command &>file 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件file中。

command &>>file 以追加的方式,把正确输出和错误信息同时保存到同一个文件file中。

&>是一种特殊写法,&>file等价于1>file 2>&1

(五)重定向的执行顺序
重定向顺序很重要:1>file 2>&1和2>&1 1>file是不同的。

1>file 2>&1。这里分两个过程:先将1重定向到file文件;之后再将2指向1,1此时已经重定向到file文件上,因此2也重定向到file。所以,最终的结果是标准输出重定向到file,标准错误也重定向到file。

2>&1 1>file。这里也分两个过程:先将2指向1,而此时1重定向的文件是默认的/dev/stdout,所以2也重定向到/dev/stdout;之后再将1重定向到file文件。也就是说,这里的标准错误和标准输出仍然是分开输出的。所以,最终的结果是标准错误输出到/dev/stdout,即屏幕上,而标准输出将输出到file文件中。

例子:文章来源地址https://www.toymoban.com/news/detail-725377.html

ls foobar >foobar.txt 2>&1
ls foobar 2>&1 >foobar.txt

到了这里,关于Shell输入输出重定向的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • shell脚本——服务器巡检(自动化运维)

     目的   自动 获取集群内 多个主机 的内存、磁盘、cpu等信息 生成日志  准备    VMware虚拟主机IP在同一个网段(互相能ping通)             虚拟主机都有公钥免登录            修改主机IP  vi/etc/sysconfig/netwoek-scripts/ifcfg-ens160            设置主机名 hostnamectl set-ho

    2024年02月15日
    浏览(38)
  • Linux&Shell--多服务器自动登录连接

    sshpass 是一个命令行工具,用于自动化SSH密码认证。它通常在脚本或自动化任务中使用,其中您需要提供密码以建立SSH连接,而无需用户干预。可以直接将密码作为命令行参数或通过文件提供,以便在建立SSH连接时自动输入密码。这对于需要自动化处理SSH连接的任务非常有用

    2024年02月03日
    浏览(51)
  • 【Linux】重定向(输入重定向 | 输出重定向)

    为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。本文将介绍如何在 Linux 中使用输入输出重定向。 输入输出文本流(I/O Stream) 表1 bash 使用的三种标准输入输出流 字段 描述

    2023年04月20日
    浏览(23)
  • Linux shell 命令中nohup 、&、重定向的使用

    一、nohup 和 使用方法 1.1、 nohup (不挂断) nohup 是 no hung up 的缩写,意思是不挂断 。 使用 Xshell 等Linux 客户端工具,远程执行 Linux 脚本时,有时候会由于网络问题,导致客户端失去连接,终端断开,脚本运行一半就意外结束了。这种时候,就可以用 nohup 指令来运行指令,即

    2024年02月22日
    浏览(37)
  • Shell 输入输出:从 Read 到管道的奇妙旅程

    在计算机世界中,Shell 是一种强大的工具,它允许我们与操作系统进行交互。Shell 提供了一种简单而强大的方式来处理输入和输出,使得我们可以在命令行中执行各种任务。本文将带你领略 Shell 输入输出的奇妙之旅,从 Read 到管道的探索。 1. Read 命令:读取输入并赋值给变量

    2024年04月14日
    浏览(26)
  • Linux输入输出重定向

    目录 Linux输入输出重定向 Linux中的默认设备 输入输出重定向定义 输入输出重定向操作符 实用形式 标准输入、标准输出、标准错误 输出重定向案例 案例1 --- 输出重定向(覆盖) 案例2 --- 输出重定向(追加)  案例3 --- 错误输出重定向 案例4 --- 正确和错误都输入到相同位

    2024年02月04日
    浏览(41)
  • 【Linux】在服务器上创建Crontab(定时任务),自动执行shell脚本

    业务场景:该文即为上次编写shell脚本的姊妹篇,在上文基础上,将可执行的脚本通过linux的定时任务自动执行,节省人力物力,话不多说,开始操作! 连上服务器后,在任意位置都可以执行: crontab -e 如果没有进入 编辑cron任务模式 根据提示查看我们的服务器上是否未安装crontab没有则

    2024年02月14日
    浏览(49)
  • Linux操作实例 – 输入输出重定向

    By Jackson 1. 前言 在操作计算机的时候,我们能够很容易通过键盘、鼠标给计算机输入信息(例如:写公文、邮件,同时通过显示器得到输出。这就是日常和计算机进行人机对话的过程。 使用Linux操作系统,由于天生需要用命令行来交互,给使用者增加了些许难度。本文简要介

    2024年02月02日
    浏览(33)
  • Java利用JSCH库远程连接Linux服务器以及操作多条Shell命令

    为了实现 DHCP 服务器的 IP 存储、回收和查询机制,我们需要将服务器中 LXD 容器的网卡 IP 查询出来,并且存储到服务器中的 Mysql 中。所以,下面介绍如何通过 Java 远程连接 Linux 服务器以及操作多条 Shell 命令。 创建 Maven 项目,导入依赖 jsch 实现远程连接,往后我们只需要调

    2024年02月13日
    浏览(41)
  • Linux运维之shell基础

    基本语法: 注意事项: ①[ 条件判断式 ],中括号和条件判断式之间必须有空格 ②if 后要有空格 例如,现在写一个if.sh脚本文件 基本语法: 注意事项: (1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。 (2)双分号“;;”表示命令序列结束,相当于

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包