Linux I/O重定向

JSON 2024-05-17 16:13:56 979

Unix 命令行的功能之一是使用输入/输出重定向和管道。在本次会议中,我们介绍了输入、输出和错误流的重定向。

Linux I/O重定向

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

bash shell 具有三个基本流;它从 stdin(流 0)获取输入,将输出发送到 stdout(流 1),并将错误消息发送到 stderr(流 2)。

键盘通常用作标准输入,而标准输出和标准错误都连接到显示器。这可能会让 Linux 新用户感到困惑,因为没有明显的方法来识别 stdout 和 stderr。有经验的用户知道将输出与错误分开非常有用。

下一节将解释如何重定向这些流。

输出重定向

标准输出 (>)

stdout 可以使用大于号重定向。扫描该行时,shell 将看到 > 符号并清除文件。

事实上,> 符号是 1> 的缩写(stdout 被称为流 1)。

datasoft @ datasoft-linux ~/test10$ echo It is summer today!
It is summer today!
 datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
 datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
 datasoft @ datasoft-linux ~/test10$ 

请注意,bash shell 在执行参数 0 之前有效地从命令行删除了重定向。这意味着在此命令的情况下:

datasoft @ datasoft-linux ~/test10$ echo Hei > greeting.txt

shell 只计算两个参数(echo = 参数 0,hello = 参数 1)。在参数计数发生之前重定向被删除。

输出文件被删除

扫描该行时,shell 将看到 > 符号并清除文件!由于这发生在解析参数 0 之前,这意味着即使命令失败,文件也将被清除!

datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
 datasoft @ datasoft-linux ~/test10$ zcho It is summer today! > summer.txt
No command 'zcho' found, did you mean:
 Command 'echo' from package 'coreutils' (main)
zcho: command not found
 datasoft @ datasoft-linux ~/test10$ cat summer.txt
 datasoft @ datasoft-linux ~/test10$

noclobber

过设置 noclobber 选项可以防止使用 > 时擦除文件。

datasoft @ datasoft-linux ~/test10$ cat summer.txt
 datasoft @ datasoft-linux ~/test10$ set -o noclobber
 datasoft @ datasoft-linux ~/test10$ echo It is cold today! > summer.txt
bash: summer.txt: cannot overwrite existing file
 datasoft @ datasoft-linux ~/test10$ set +o noclobber
 datasoft @ datasoft-linux ~/test10$ 

否决noclobber

noclobber 可以用 >| 来否决。

datasoft @ datasoft-linux ~/test10$ set -o noclobber
 datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
bash: summer.txt: cannot overwrite existing file
 datasoft @ datasoft-linux ~/test10$ echo It is summer today! >|summer.txt
 datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
 datasoft @ datasoft-linux ~/test10$

追加 (>>)

使用 >> 将输出附加到文件。

datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
bash: summer.txt: cannot overwrite existing file
 datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
 datasoft @ datasoft-linux ~/test10$ echo Where is the hot summer ? >> summer.txt
 datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
Where is the hot summer ?
 datasoft @ datasoft-linux ~/test10$

错误重定向

2> 标准错误

重定向 stderr 是通过 2> 完成的。这对于防止屏幕上出现错误消息非常有用。

下面的屏幕截图显示了 stdout 重定向到文件,stderr 重定向到 /dev/null。写 1> 与 > 相同。

 datasoft @ datasoft-linux ~/test10$ find / > allfiles.txt 2> /dev/null
 datasoft @ datasoft-linux ~/test10$

2>&1

要将 stdout 和 stderr 重定向到同一文件,请使用 2>&1。

datasoft @ datasoft-linux ~/test10$ find / > allfiles_and_error.txt 2>&1

请注意,重定向的顺序很重要。例如,命令

ls > dirlist 2>&1

将标准输出(文件描述符 1)和标准错误(文件描述符 2)定向到文件目录列表,而命令

仅将标准输出定向到文件 dirlist,因为标准错误在标准输出重定向到 dirlist 之前复制了标准输出。

输出重定向和管道

默认情况下,在命令行上使用管道时,无法在 stderr 内进行 grep,因为只传递了 stdout。

datasoft @ datasoft-linux ~/test10$ rm file35 file=10 | grep test
rm: cannot remove 'file35': No such file or directory
rm: cannot remove 'file=10': No such file or directory
 datasoft @ datasoft-linux ~/test10$ rm file10 | grep.txt

使用 2>&1 您可以强制 stderr 转到 stdout。这使得管道中的下一个命令能够作用于两个流。

datasoft @ datasoft-linux ~/test10$ rm file35 file10 file101 2>&1 1>&2 | grep file35
rm: cannot remove 'file35': No such file or directory
 datasoft @ datasoft-linux ~/test10$ 

您不能同时使用 1>&2 和 2>&1 来切换 stdout 和 stderr。

datasoft @ datasoft-linux /$ rm file35 file10 file101 2>&1 1>&2 | grep file35
rm: cannot remove 'file35': No such file or directory
 datasoft @ datasoft-linux /$ echo file35 2>&1 1>&2 | sed 's/file35/FILE35/'
FILE35

您需要第三个流来在管道符号之后切换 stdout 和 stderr。

datasoft @ datasoft-linux /$ echo file35 2>&1 1>&2 | sed 's/file35/FILE35/'
FILE35
 datasoft @ datasoft-linux /$ echo file35 3>&1 1>&2 2>&3 | sed 's/file35/FILE35/' file35
file35
sed: can't read file35: No such file or directory
 datasoft @ datasoft-linux /$

连接 stdout 和 stderr

&> 构造会将 stdout 和 stderr 放入一个流中(到一个文件)。

datasoft @ datasoft-linux ~$ cd test10
 datasoft @ datasoft-linux ~/test10$ rm file35 &> out_and_err
 datasoft @ datasoft-linux ~/test10$ cat out_and_err
rm: cannot remove 'file35': No such file or directory
 datasoft @ datasoft-linux ~/test10$ echo file35 &> out_and_err
bash: out_and_err: cannot overwrite existing file
 datasoft @ datasoft-linux ~/test10$ 

输入重定向

标准输入(<)

重定向标准输入是通过 < (0< 的简写)完成的。

datasoft @ datasoft-linux ~$ cat < mno.txt
What is your name?
My name is prasanta.
 datasoft @ datasoft-linux ~$ tr 'onetw' 'onezz' < mno.txt
Whaz is your name?
My name is prasanza.
 datasoft @ datasoft-linux ~$

here-is-document是一种追加输入直到遇到特定序列(通常是EOF)的方法。 EOF 标记可以按字面输入,也可以使用 Ctrl-D 调用。

检查下面的代码

datasoft @ datasoft-linux ~$ cat < mno.txt
> What is your name?
> My name is prasanta.
> EOF
bash: mno.txt: cannot overwrite existing file
 datasoft @ datasoft-linux ~$ cat mno.txt
What is your name?
My name is prasanta.
 datasoft @ datasoft-linux ~$ cat < mno.txt
> What's your name?
> prasanta
> ^C
 datasoft @ datasoft-linux ~$ cat mno.txt
What is your name?
My name is prasanta.
 datasoft @ datasoft-linux ~$


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/532.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Java获取重定向后的真实URL地址
Java 获取HTPP 301 / 302 重定向后的Url地址,301和302对SEO的影响
Nginx 跳转到www二级域名,域名重定向配置方法。
for循环的 i++ 和 ++i 的区别
Linux—文件树
Linux 安装 Redis 详细步骤讲解
Linux—文件树
Linux Centos 使用 Redis service 启动,Redis service 脚本编写
阿里云Linux、代理Squid服务安装,高匿、用户/密码校验配置
最新文章
Linux I/O重定向 979
Ruby 循环 - while、for、until、break、redo 和 retry 461
Node.js:全局对象 364
如何使用终端检查Linux上的内存使用情况 355
JavaScript对象详细剖析 200
Python print() 函数 276
PHP if/else/elseif 语句 301
HTML5 Canvas弧线教程 251
Java赋值运算符 349
XML内部实体和外部实体 367
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 685770
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 674999
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 607891
免费天气API,天气JSON API,不限次数获取十五天的天气预报 602202
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 554783
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 509881
Elasticsearch教程(四) elasticsearch head 插件安装和使用 480777
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 267399
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244527
Elasticsearch教程(一),全程直播(小白级别) 226520
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...