Shell输入输出重定向

Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。

一、输出重定向

命令的输出不仅可以是显示器,还可以是其他文件,这被称为输出重定向。

命令输出重定向的语法为:

xjh@ubuntu:~/iot/tmp$ command > file

这样,输出到显示器的内容就可以被重定向到文件。

例如,下面的命令在显示器上不会看到任何输出:

xjh@ubuntu:~/iot/tmp$ who > users

打开 users 文件,可以看到下面的内容:

xjh@ubuntu:~/iot/tmp$ cat users 
xjh      tty1         2022-07-03 13:31
xjh      :0           2022-07-03 13:20 (:0)
xjh      pts/4        2022-07-03 14:07 (:0)
xjh@ubuntu:~/iot/tmp$ 

输出重定向会覆盖文件内容,比如:

xjh@ubuntu:~/iot/tmp$ echo 1 2 a b c > users 
xjh@ubuntu:~/iot/tmp$ cat users 
1 2 a b c
xjh@ubuntu:~/iot/tmp$ 

如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:

xjh@ubuntu:~/iot/tmp$ echo d e f 1 3 >> users 
xjh@ubuntu:~/iot/tmp$ cat users 
1 2 a b c
d e f 1 3
xjh@ubuntu:~/iot/tmp$ 

二、输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

xjh@ubuntu:~/iot/tmp$ command < file

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号(>),输入重定向是小于号(<)。

例如,计算 users 文件中的行数,可以使用下面的命令:

xjh@ubuntu:~/iot/tmp$ wc -l users
2 users

也可以将输入重定向到users文件: 

xjh@ubuntu:~/iot/tmp$ wc -l < users 
2

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

三、重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

(1)如果希望 stderr 重定向到 file,可以这样写:

xjh@ubuntu:~/iot/tmp$ command 2 > file

(2)如果希望 stderr 追加到 file 文件末尾,可以这样写:

xjh@ubuntu:~/iot/tmp$ command 2 >> file

其中2 表示标准错误文件(stderr)。

(3)如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

xjh@ubuntu:~/iot/tmp$ command > file 2>&1

或(为啥不直接 command 2&1 > file 这样呢?)

xjh@ubuntu:~/iot/tmp$ command >> file 2>&1

(4)如果希望对 stdin 和 stdout 都重定向,即command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2,可以这样写:

xjh@ubuntu:~/iot/tmp$ command < file1 >file2

全部可用的重定向命令列表

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

四、Here Document

Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:

command << delimiter
document
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

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

下面的例子,通过 wc -l 命令计算 document 的行数:

xjh@ubuntu:~/iot/tmp$ wc -l << EOF
> THIEI
> ADS 
> DAJSKDJAL
> EOF
3
xjh@ubuntu:~/iot/tmp$ 

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

#!/bin/bashcat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

 下面的脚本通过 vi 编辑器将 document 保存到 test.txt 文件:(运行报错!)

#!/bin/shfilename=test.txt
vi ${filename} << EndOfCommandsThis file was created automatically from a shell script.I am handsome!
EndOfCommands

五、/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

xjh@ubuntu:~/iot/tmp$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

xjh@ubuntu:~/iot/tmp$ command > /dev/null 2>&1

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

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

相关文章

一个基于POP3协议进行邮箱账号验证的类

最近老陈要针对企业邮箱做一些开发&#xff0c;以对接企业OA神马的&#xff0c;但企业邮箱唯独没有开放账号密码验证功能&#xff0c;很恼火&#xff01;不得已&#xff0c;翻出早些年的Asp代码改编成了C#类&#xff0c;实现了一个C#下的通过POP3协议进行邮箱账号验证的类&…

cobbler get-loaders 通过代理下载

2019独角兽企业重金招聘Python工程师标准>>> cobbler 版本是2.6.3&#xff0c;可以通过系统环境变量设置proxy&#xff0c;支持 HTTP_PROXY、HTTPS_PROXY、FTP_PROXY 三个变量。 cobbler 版本是2.6.6时&#xff0c;需要从/etc/cobbler/settings 中增加proxy_url_ex…

Shell文件包含

像其他语言一样&#xff0c;Shell 也可以包含外部脚本&#xff0c;将外部脚本的内容合并到当前脚本。 Shell 中包含脚本可以使用&#xff1a; . filename 或者 source filename 两种方式的效果相同。简单起见&#xff0c;一般使用点号(.)&#xff0c;但是注意点号(.)和文件…

Vim高级使用 - CentOS下使用VIM打造C/C++开发环境

使用TagList http://blog.csdn.net/fbfsber008/article/details/7044723 转载于:https://www.cnblogs.com/tiantao/p/2389126.html

Shell数组:shell数组的定义、数组长度

bash支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;并且没有限定数组的大小。类似与C语言&#xff0c;数组元素的下标由0开始编号。获取数组中的元素要利用下标&#xff0c;下标可以是整数或算术表达式&#xff0c;其值应大于或等于0。 定义数组 在Shell中…

分析busybox的源码

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 busybox详解_linuxarmsummary的博客-CSDN博客 一、前言 因为uboot给内核传参的bootargs中有“init/linuxrc”这个项目&#xff0c;而由前面的分析可知/linuxrc这个二进制文件位于根文件系统中&…

Vmware vSphere 十个疑难问题解决方法

Vmware vSphere疑难问题解决方法导读&#xff1a;这里汇总了10个Vmware vSphere常见的问题&#xff1a;清除vSphere Client的登录记录、Linux系统VMXNET3虚拟网路卡时UDP包被Drop掉等&#xff0c;并给出了具体的解决办法。关键词&#xff1a;VMware vSphere1、清除vSphere Clie…

PHP中开发的良好习惯总结(持续更新) By ACReaper

最近在自己用php在写一个商城&#xff0c;再这个工程中学习到了很多的开发经验。 1.为了更好的调试和开发php&#xff0c;在开发状态中到php.ini设置开发的错误报告 在ubuntu中&#xff0c;其在/etc/php5/apache2/php.ini中。用命令打开后&#xff0c;找到 error_reporting E_…

Makefile中常用的函数

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、Makefile中的函数格式 函数的调用和变量的调用很像。引用变量的格式为$(变量名)&#xff0c;而函数调用的格式如下&#xff1a; $(<function> <arguments>) 或者是…

彻底解决zend studio 下 assignment in condition警告

最近在mac系统下安装zend studio作为php开发工具&#xff0c;把以前的代码导入&#xff0c;发现项目中有很多 “assignment in condition”的警告&#xff0c;造成原因是在条件判断的if、while中使用了如下类似的做法&#xff1a; if ($res $other)while (($row $res->fet…

添加分页

<div style"text-align: center; padding-top: 10px"><webdiyer:AspNetPager ID"AspNetPager1" runat"server" PageSize"20" FirstPageText"首页"CssClass"anpager" LastPageText"尾页" NextP…

Makefile中命令的编写

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 简述 Makefile的规则&#xff0c;是由依赖关系规则和命令组成的。 Makefile中所使用的命令是由 shell 命令行组成&#xff0c;它们是一条一条执行的。 Makefile 中的任何命令都要以ta…

走出浮躁的泥沼:浮躁的社会原因 控制好自己的物欲

http://www.nowamagic.net/librarys/veda/detail/2265现在这个社会&#xff0c;大家都很浮躁。简单说&#xff0c;因为他是消费者。 具体的逻辑推理是这样的&#xff1a; 1. 现在的社会是一个“富裕社会”&#xff08;Affluent Society&#xff09;&#xff0c;物质极大丰富&am…

c# 连接各种数据库 Access、Server等

1.C#连接连接Access程序代码:usingSystem.Data;usingSystem.Data.OleDb;..stringstrConnection"ProviderMicrosoft.Jet.OleDb.4.0;";strConnection"Data SourceC:BegASPNETNorthwind.mdb";OleDbConnection objConnectionnewOleDbConnection(strConnection)…

make命令的参数选项

在执行 make 命令时&#xff0c;有时根据需要&#xff0c;可以添加某些参数选项。比如只打印命令但不执行命令的参数选项是 "-n" &#xff0c;还有只执命令不打印命令的参数选项是 "-s"&#xff0c;包含其它文件的路径参数选项是 "-include"等等…

〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示

有没有遇到一种情况&#xff1a; 在工作区1打开了应用程序Google Chrome&#xff1b; 这个时间感觉它打开速度比较慢&#xff0c;就快捷键切换到工作区2了&#xff1b; 结果这个时候&#xff0c;Google Chrome就直接在工作区2打开&#xff0c;多不爽&#xff1f;&#xff01; &…

oracle 插入含字符串

1、创建表 SQL> create table t(id number,name varchar2(20)); 表已创建。 2、常规方式插入 SQL> insert into t values(1,’a&b’); 输入 b 的值: a&b 原值 1: insert into t values(1,’a&b’) 新值 1: insert into t values(1,’aa&b’) 已创建 1 行…

认识Makefile文件

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、Makefile文件是什么 Makefile 文件描述了 Linux 系统下 C/C 工程文件的编译规则&#xff0c;比如某些文件是否需要编译、文件编译的顺序、文件间的依赖关系、文件是否需要重建等等…

搭建Spring MVC 4开发环境八步走

Spring MVC作为SpringFrameWork的产品&#xff0c;自诞生之日&#xff0c;就受到广泛开发者的关注&#xff0c;如今Spring MVC在Java中的发展可谓是蒸蒸日上&#xff0c;如今如果再有开发者说&#xff0c;不了解Spring MVC&#xff0c;或许就被人笑掉大牙。煽情的话就不说了&am…

JQ获取CKeditor的值

var editor CKEDITOR.replace("content"); editor.setData(""); alert(CKEDITOR.instances.content.getData()); var editor CKEDITOR.replace("content"); alert(editor.getData()); 转载于:https://www.cnblogs.com/Alandre/p/3405363.htm…