Linux中的输入输出重定向

摘要:
标准输入(stdin)、标准输出(stdout)、filelisting.txt将dir命令的标准屏幕输出重定向到文本文件filelisting..txt;不对errorlisting.txt文件写入任何信息;Permissiondenied不考虑标准输出是否正确

 

有三个最重要的输入输出流:标准输入(stdin),标准输出(stdout),标准错误(stderr)。它们对于控制台(控制台指的是键盘用于输入,屏幕用于输出)来说是缺省的,但是它们可以被重定向。

 

重定向标准输出:可以使用“>”符号,

举例:

  dir my_dir > filelisting.txt                      

将把 dir 命令的标准屏幕输出重定向到文本文件 filelisting.txt 文件里,所以屏幕上没有任何输出。这个文件可以用来编辑(比如使用 pico 文本编辑器)或者合并到其他的文件里。

 

重定向标准错误:可以使用结构“2>”

举例:

  dir my_dir 2> errorlisting.txt                    

以上命令将送标准输出到屏幕上,如果没有错误信息,将没有任何信息写到 errorlisting.txt 文件里。如果出错,则没有什么东西输出到屏幕,而文件 errorlisting.txt 将包含错误信息。错误信息有可能是这样的:

  dir: my_dir:Permission denied                     

 

不考虑标准输出正确与否都输入到同一个文件中:

最后,我也可以把标准输出和标准错误一起输出到同一个文件里,

  dir my_dir > file_and_error_listing.txt 2>&1      

以上命令先重定向标准输出到文本文件里,然后再重定向标准错误到和标准输出同样的位置。它如何实现可能看起来有点古怪,但是是可行的。

 

追加重定向:

在以上的例子里,如果重定向的文件已经存在,该文件会被覆盖。如果你要追加到该文件的末尾,可以使用“>>”符号,以上的例子就变成:

dir my_dir >> filelisting.txt                        
dir my_dir 2>> errorlisting.txt                      
dir my_dir >> file_and_error_listing.txt 2 > &1      

如果你对“2>”感到很迷惑,这里有一个简单的办法可以帮你理解,标准流有标准的解析器:“0”代表标准输入,“1”代表标准输出,“2”代表标准错误。

  dir my_dir > file.txt                            

是以下命令的简写方式:

  dir my_dir 1 > file.txt                          

那么以下命令就是用来输出标准错误:

  dir my_dir 2 > file.txt                          

 

管道符:

还有,你还可以使用符号“|”(管道命令)把一个命令的标准输出送到另外一个命令的标准输入。在以下这个标准的例子里,dir 命令的标准输出通过管道输入到命令 more 里(输出满屏的时候自动暂停):

  dir | more                                       

 

同时实现标准输出与输入到文件:

你还可以使用“tee”命令把标准输出同时写到文件和屏幕,

  dir | tee filelisting.txt                        

tee “T型连接器的模拟音,在管道中的主要的用途是分流

 

标准输入重定向:

这个部分这样都用来讲述标准输出重定向,对于标准输入重定向不像标准输出重定向那么有用,但是它可以使用以下方式实现:

  cat < my_file                                    

 

直接插入式的标准输出:

还有一种叫做直接插入式的标准输出,可以通过“<<”来实现。不要管它了,看起来对我没有什么实际用处。不过,如果你真的想知道,这里有一个例子(这里“>”式第二个提示符)

   cat << my_marker                                
   > my_line_from_the_keyboard                     
   > another_line_from_the_keyboard                
   > my_marker                                     

 

输出到其他设备:

除了重定向到常规文件和过滤器之外(如以上的例子所示),你还可以重定向到设备和其他特殊文件。看下面这些例子。

终端:

重定向到设备文件的例子。以下命令将显示文件列表到第四个文本终端:

dir > /dev/tty4                                      

垃圾站:

   echo ‘hello’> /dev/null                        

FIFO

以下是一个重定向到一个特殊的 FIFO (先进先出)文件的例子。该命令送信息”you are lucky”到叫做“lucky” ICQ 用户 UIN 7777777 (假定你已经用你的 ICQ 程序连接到 ICQF 服务器上了)

  echo message 7777777 “you are lucky” < ~/.licq/licq_fifo

以上的例子能够工作是因为在你 licq 目录下的文件“licq_fifo”是一个特别的 FIFO 序列文件。以上这个例子,对比于在图形用户界面下的 ICQ 程序有什么特别有用的地方吗?举个例子,你可以写一个短的脚本带上多个信息给你的那些 ICQ 伙伴们:

#!/bin/bash
echo Messaging UIN: $1 Message: $2 Times: $3
# The next command puts puts your licq in the status "on-line
invisible".
echo 'status *online' > ~/.licq/licq_fifo
c=0
while [ $c -le $3]
do
echo message $1 $2 > ~/.licq/licq_fifo
c=`expr $c + 1`
echo $c " "
done
echo 'status offline' > ~/.licq/licq_fifo
echo "all done"

 

这个例子利用了 licq 通信模型 (FIFO文件)和简单的文件重定向功能,给你一个关于如何自动化”licq 的主意。

 

------------------------------------------------

 基础知识

文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。常用的文件描述符如下:

文件描述符

名称

常用缩写

默认值

0

标准输入

stdin

键盘

1

标准输出

stdout

屏幕

2

标准错误输出

stderr

屏幕

我们在简单地用<>时,相当于使用 0< 1>(下面会详细介绍)。

管道“|”(pipe line),把上一个命令的 stdout 接到下一个命令的 stdin;

tee 命令的作用是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

[编辑] 简单重定向

·                     cmd > file

cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bashnoclobber选项可以防止覆盖原有文件。

·                     cmd >> file

cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面。

·                     cmd < file

使cmd命令从file读入

·                     cmd << text

从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用 <<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考后面的例子。

·                     cmd <<< word

word(而不是文件word)和后面的换行作为输入提供给cmd

·                     cmd <> file

以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。

·                     cmd >| file

功能同>,但即便在设置了noclobber时也会覆盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。

[编辑] 使用文件描述符的重定向

使用文件描述符的重定向都使用了&符号。

cmd >&n

把输出送到文件描述符n

cmd m>&n

把输出 到文件符m的信息重定向到文件描述符n

cmd >&-

关闭标准输出

cmd <&n

输入来自文件描述符n

cmd m<&n

m来自文件描述各个n

cmd <&-

关闭标准输入

cmd <&n-

移动输入文件描述符n而非复制它。(需要解释)

cmd >&n-

移动输出文件描述符 n而非复制它。(需要解释)

[编辑] 重定向的组合应用

cmd 2>file

把文件描述符2重定向到file,即把错误输出存到file中。

cmd > file 2>&1

把标准错误重定向到标准输出,再重定向到file,即stderrstdout都被输出到file

cmd &> file

功能与上一个相同,更为简便的写法。

cmd >& file

功能仍与上一个相同。

cmd > f1 2>f2

stdout重定向到f1,而把stderr重定向到f2

tee files

stdout原样输出的同时,复制一份到files中。

tee files

stderrstdout都输出到files中,同时输出到屏幕。

免责声明:文章转载自《Linux中的输入输出重定向》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Navicat远程连接MySQL数据库mysql源码安装(包括5.5和5.7)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用jq中jSignature做手动签名

<!DOCTYPE html><html lang="zh-CN"><head> <title>手写板签名demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <...

20款免费备份文件软件

      经常对电脑中资料进行备份的重要性已不用多说,但每次都辛苦地逐个目录拷贝、或花半天时间整理目录和文件、更不能想象重装系统后繁复的系统设置调整。如果你曾经因为这些而对系统备份工作有所迟疑,那么现在让你彻底告别这些顾虑! 1. Areca Backup 7.1.10 Areca Backup 是一个开源的备份软件,用 Java 写成。Areca B...

hbase1.3.1安装

下载:    hadoop@master:~$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.3.1/hbase-1.3.1-bin.tar.gz解压到/opt/Hadoop,    hadoop@master:~$ sudo tar -zxvf hbase-1.3.1-bin.tar.g...

.net core 学习小结之 配置介绍(config)以及热更新

命令行的配置 var settings = new Dictionary<string, string>{ { "name","cyao"}, {"age","18"} }; var builder = new Configura...

Samba服务的配置总结

之前介绍了Linux下Samba服务器部署,这里简单总结下Samba服务参数的配置说明: Samba服务的主配置文件是smb.conf,默认在/etc/samba/目录下。smb.conf含有多个段,每个段由段名开始,直到下个段名。每个段名放在方括号中间。每段的参数的格式是:名称=指。配置文件中一行一个段名和参数,段名和参数名不分大小写。除了[global...

使用Nginx+Lua实现waf

使用Nginx+Lua实现waf 软件包需求: 1 、Nginx兼容性【最后测试到1.13.6】 wget http://nginx.org/download/nginx-1.13.6.tar.gz 2 、PCRE为Nginx编译安装关系的依赖 wget https://jaist.dl.sourceforge.net/project/pcre/pcre...