足球盘口软件
当前位置: 足球盘口软件 > 前端 >
文件描述符和重定向,符和重定向

Linux---文件呈报符和重定向

本文介绍linux汉语件陈说符与重定向的相干文化,文件叙述符是与公事输入、输出相关联的整数,它们用来追踪已开发的文书。有亟待的对象参照他事他说加以侦查下。

Linux 文件叙述符和重定向,符和重定向

1.备选知识

行业内部输入(stdin卡塔尔(قطر‎、标准输出(stdoutState of Qatar和正规错误(stderr卡塔尔国是编写脚本的时候日常应用的,因为出口的消息或者是上述的后生可畏种。
文件汇报符 是与开荒的某部文件或然数额流相关联的整数。文件叙述符0,1,2是系统留住的。
0 - stdin(标准输入State of Qatar
1 - stdout(标准输出卡塔尔国
2 - stderr(规范错误卡塔尔

初藳出处:

介绍

文件陈说符是与公事输入、输出相关联的莫西干发型,在编排脚本时会常常使用标准的文件陈说符来将内容重定向输出,0、1、2是文本叙述符(分别对应stdin、stdout、stderr),< 、>, >>叫做操作符。

 

概念

stdin(0):标准输入,这么些概念有一些不太轻巧精通比如:1.应用<从文件中读取内容,2.脚下命令将内容通过管道传输给下多少个下令而下多个命令,而实在内容是传输给了stdin所以下贰个指令也是从stdin中读取内容。

stdout(1卡塔尔国:标准输出;那是暗中同意选项。使用方式:1>等价于>  或者 1>>等价于>>,;如若想使用其余文件描述符,必需将文件叙述符放在操作符此前。

stderr(2卡塔尔国:规范错误,使用方法2>可能2>>,规范错误能够将错误新闻插入到文件而不在终端突显 。

<:从文件中读取内容。

>:将内容插入到文件,每便插入前都会清空文件内容。

>>:将内容插入到文件, 将内容增到存活文件的结尾。

 

实例

 生成测量检验数据

echo "hello word" > test1

cp test1 test2

chmod 000 test2

stdin(0)

1.从文本中读取内容

cat <test1

图片 1

2.将读取到的剧情通过管道传输给下一个发令

cat test1 |tr -t 'a-z' 'A-Z' >test1.new

图片 2

stdin(1) 

将内容重定向到文件

echo "this is stdout 1" >std1

图片 3

追加内容到文件

图片 4 

stderr(2)

遇到报错的时候终端会显得错误,能够将将错误新闻写入文件不让终端显示

图片 5

图片 6

再正是将stderr和stdout音讯都插入到文件,使用&

图片 7

 

重定向脚本内部文本块,cat <<EOF>>log.txt EOF

 

自定义文件叙述符

自定义文件叙述符也急需用到exec;< ,>,>>意思和前边解释的相仿,当调用自定义的叙说符时需求在自定义的叙说符前加上&。

1.自定义stdin,将3定义为stdin从文件中读取内容,然后就足以调用3了,调用3和一直调用文件结果是一模二样的,有一点点肖似赋值。

exec 3<test1

图片 8

2.自定义stdout,测量检验结果发将来自定义描述符中使用>往文件中另行写多少并不会清空以前的内容,不过在正规的陈说符中是会清空再写入的。

图片 9

图片 10

2.实例

echo This is a sample. > temp.txt

可将文本输出到 temp.txt 中,是通过截断文件的方式,也就是说在echo命令写入前先将文件中的内容清空。

echo This is a sample. >> temp.txt

上述命令是追加的方式。

说明重定向之前先了解一下什么是成功和不成功的命令。

当一个命令发生错误并退出的时候,它会返回一个非0的值。成功后会返回0。可以通过 $? 查看返回的值。

ls 2> out.txt

将错误输出到文件中。

你也可以这样:

cmd 2> out.txt 1> temp.txt

将标准错误和标准输出重定向到两个文件中。当然,还有更精简的方式输出到同一个文件中:

cmd 2>&1 out.txt

有时候你并不想保存错误输出,那就将它引向一个“黑洞”(/dev/null)吧,就像错误输出没有产生过一样。

这个时候,如果你既想把输出保存起来,同时又想查看输出,怎么办呢?

command | tee out.txt | cat -n

这个时候command 的结果会保存在 out.txt 中,同时也会通过管道最为标准输出向下传递。 cat -n 将结果加上行号输出。

我们也可以使用 stdin 作为命令参数。只需要将-作为命令的文件名即可。

$ echo who is this | tee -
who is this
eho is this

linux下的文件陈说符是与公事输入、输出相关联的平头。它们用来跟踪已开辟的文本。
最广大的文书陈说符是stdin、stdout和stderr.大家能够将某些文件呈报符的内容重定向到另多个文件呈报符中。

总结

 文件汇报符在剧本中使用的特别频仍,常用的应用方法就是专门的工作输出和规范错误。

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

文件叙述符和重定向,符和重定向 介绍 文件汇报符是与公事输入、输出相关联的卡尺头,在编排脚本时会平常选用专门的学业的文件叙述符来...

3.原理

默认的重定向操作符使用标准输出。因此 > 等同于 1> 。

上面给出一些对文本呈报符举行操作和重定向的例证。

4.补充

从 stdin 读取输入的命令能以多种方式接受数据。

将文件重定向到命令,借助重定向,我们可以像使用 stdin 那样从文件中读取数据。

$ cmd < file

自定义文件描述符:

创建一个文件描述符进行文件读取:

$ exec 3<input.txt # 使用文件描述符3打开并读取文件

我们可以这样使用它:

$ echo this is a test > input.txt
$ exec 3<input.txt

这就可以在命令中使用文件描述符3了。

$ cat <&3
this is a test

如果想再次读取就不能使用3了,需要再次分配读取。

创建文件描述符用于写入:

$ exec 4>output.txt
$ echo newline > &4
$ cat outline
newline

dev/stdin -> proc/self/fd/0 -> dev/pts/1

标准操作下的输入输出,指向了虚拟目录下当前进程的终端中。

1.5.1 预备知识

1.2重定向&管道 原理:

我们在编写脚本时会频仍利用专门的工作输入(stdinState of Qatar、标准输出(stdout卡塔尔(قطر‎和标准错误(stderr卡塔尔国。

重定向

$ tail -f /var/log/message  > abc

然后挂起。 ps 查看一下该进程的进程号是 15551 .

$ cat /proc/15551/fd/?

可以看到:

/proc/15551/fd/0 -> /dev/pts/1
/proc/15551/fd/1 -> /roor/test/abc #上述命令的重定向输出文件
/proc/15551/fd/2 -> /dev/pts/1
/proc/15551/fd/3 -> /var/log/message
/proc/15551/fd/4 -> inotify

重定向就是将链接指向执行的文件。

经过剧情过滤将出口重定向到文件是我们从事的底子职责之大器晚成。

管道

将前面命令的标准输出作为后面命令的标准输入。

注意是 标准输出 也就是说,在管道传递的时候标准错误输出已经被过滤掉了。所以,前面命令的标准错误输出都会打印在终端上.

有很多命令不直接支持标准输入的形式作为输入。

$ which find | ls -l

不能输出 find 的信息。使用如下的方式即可。

$ which find | xargs ls -l 

1.预备知识 标准输入(stdin卡塔尔(قطر‎、规范输出(stdout卡塔尔国和行业内部错误(stderrState of Qatar是编辑脚本的时候经常应用的,因为出口的音讯可...

当命令输出文本时,这个输出文本有不小可能率是错误新闻,也大概是健康的(非错误的)输出新闻。
单靠查阅输出的公文本人,  大家不可能区分哪些是正规的输出文本,哪些是荒诞文本。不过,大家能够透过文件陈述符来解决那一个主题材料,将这么些与一定描述符关联的公文提收取来。
文件汇报符是与三个张开的文书或数额流相关联的偏分头。文件陈述符0、1甚至2是系统留住的。
0——stdin(规范输入)
1——stdout(规范输出)
2——stderr(规范错误)

1.5.2  实战演习

将出口文本重定向或保存到一个文书中:

 

$echo"This is a sample text 1">temp.txt

 这种措施通过截取文件的章程,将出口文本存款和储蓄到文件temp.txt中,相当于说在把echo命令的出口写入文件在此以前,temp.txt中的内容首先会被清空。

接下去,再看另一个例证:
$echo "this is sample text 2" >>temp.txt

 这种方法会将文件追加到对象文件中。

>和>>并不相似。就算那多少个操作符都能够将文件重定向到文件,可是前面一个会先清空文件,再写入内容;而前面一个会将内容充实到存活文件的尾巴。
能够用上面包车型地铁点子查看文件内容:

$cat temp.txt

this is sample text 1
this is sample text 2

 在linux操作系统中,当使用重定向操作符时,重定向的剧情不会并发在终极,而是径直被导入文本。重定向操作符默许使用正规输出。假诺想行使一定的文本描述符,你必须要将呈报符置于操作符早先。

>等同于1>;对于>>来讲,景况也贴近(即>>等同于1>>卡塔尔国。
来拜候哪些是正经错误甚至哪些对它重定向。当命令输出错误音讯时,stderr新闻就能被打字与印刷出来。思谋上面包车型地铁例子:
$ Is + 

Is:cannot access +:No such file or directory 

 这里,+是贰个野鸡参数,因些将回到错误消息。

[ 成功和不成事的通令
   当一个下令爆发错误并退回时,它会回到二个非0的退出状态;而当命令成功完毕后,它会再次来到数字0。退出状态能够从卓绝变量$? 中获得(在指令实施语句之后立时运转echo$?,就足以打印出分离状态)。]

将stderr文本打字与印刷到荧屏上,实际不是文本中。

$ Is+>out.txt

Is:cannot access+:No such file or directory

 可是在上边包车型地铁一声令下中,stdout未有别的输出,因为漏洞非常多已经重定向到out.txt中去了。

$ Is +2> out.txt # 符合规律运行

 你能够将stderr单独重定向到一个文书,将stdout重定向到另多少个文本:

$ cmd 2>stderr.txt 1>stdout.txt

 还足以行使上边包车型客车诀窍将stderr转变来stdout,使得stderr和stdout都被重定向到同二个文书中:

$ cmd 2>&1 output.txt

 可能利用下列方法:

$ cmd&> output.txt

 偶然候,在输出中也许带有部分不供给的信息(比方除错消息)。要是你不想让终端中充满着关于stderr的繁枝末节,那么您能够将stderr的出口重定向到/dev/null, 保障全部都会被扫除得干干净净。借使大家有八个文件,分别是a1、a2、a3。可是普通顾客对a1不曾“读风姿罗曼蒂克写意气风发执行”权限。假让你须要打字与印刷文件名以a初步的具有文件的剧情,你可以应用cat命令。

安装有个别测量试验文件:

$ echo a1 >a1

$ cp a1 a2;cp a2 a3;
$ chmod 000 a1 #打消全部权力

 固然能够利用通配符(a*卡塔尔国呈现全数的文本内容,但是系统会来得一个失误音讯,因为对文本a1未有可读权限。

$ cat a* 

cat:a1 permission denied
a1
a1 

 在这之中,cat:a1:permission denied 归于stderr。我们能够将stderr新闻重定向到三个文件中,而stdout 依然维持不改变。寻思如下代码:

$ cat a* 2>err.txt #stderr被重定向到err.txt

a1
a1
$ cat err.txt
cat:a1:permission denied

 观看上面包车型大巴代码:

$ some_command 2>/dev/null

 本节是 玩转Linux文件汇报符和重定向 第二页的剧情,迎接大家继续阅读。

在这里个示例中,来自stderr的输出被丢到文件/dev/null中。/dev/null是贰个非凡的设备文件,这么些文件吸收接纳到的别样数据都会被撤废。

就此,null设备日常也被为位桶(bit bucket卡塔尔国或黑洞。
当对stderr或stdout进行重定向时,重定向的文本将盛传文件。

因为文件早就被重定向到文件中,也就没多余什么事物能够通过管道(|)传给接下去的吩咐,而这么些命令是经过stdin来采纳文本的。
不过有一个精彩绝伦的主意能够大器晚成边将数据重定向到文件,另一面还足以提供一些重定向数据的别本作为一而再命令的stdin。

这一切都得以使用tee来兑现。

举个例证:要在终端中打字与印刷stdout,同时将它重定向到二个文本中,那么能够这样使用tee:

command | tee FILE1 FILE2 

 在下边包车型客车代码中,tee命令选拔到来自stdin的数据。它将stdout的蓬蓬勃勃份副写入文件out.txt,同不常候将别风姿浪漫份别本作为后续命令的stdin。命令cat -n将从stdin中收到到的每风流浪漫行数据前增进行号并写入stdout:

$ cat a*| tee out.txt| cat -n

cat: a1: permission denied
1 a1
2 a1  

查看out.txt 的内容:

$ cat out.txt

a1
a1 

 注意,cat:a1:permission denied并未在其余文件内容中冒出。那是因为那几个新闻归于stderr,而tee只好从stdin中打开读取。

暗中同意景况下,tee命令会将文件覆盖,可是提供了贰个-a选项,能够用来充实内容。比如:

$ cat a*| tee -a out.txt| cat -n.

 带有参数的吩咐能够写成:command FILE1 FILE2依次类推,或许简轻巧单地用command FILE。

咱俩得以接受stdin作为命令参数。只须要将-作为命令的文书名参数就可以:

$ cmd1 |cmd2 |cmd - 

 例如:

$ echo who is this | tee-

who is this
who is this 

 或然大家也足以将/dev/stdin作为出口文件名来使用stdin。

看似的,使用/dev/stderr代表正式错误,/dev/stdout代表专门的工作输出。那一个非凡的装置文件分别对应stdin、stderr和stdout。

补偿内容:
从stdin读取输入的吩咐能以八种主意选用数据。别的,还足以用cat和管道来制定大家同心协力的文本描述符,比如:

$ cat file | cmd

$ cmd1 | cmd2 

 1.将文件重定向到命令

依赖重定向,大家得以像使用stdin那样从文件中读取数据:

$ cmd <file 

 

2.重定向脚本内部的文本块
奇迹,须求对文本块(多行文本)像正规输入同样举行重定向。酌量三个非正规情况:源文本就放在shell脚本中。

来看上面这段shell脚本啊,向log文件中写入尾部数据,可以依照下边包车型客车措施成功:

#!/bin/bash

cat <<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function:System statistics
EOF 

 在cat <<EOF>log.txt与下三个EOF行之间的装有文本行都会被视作stdin数据。log.txt文件的从头到尾的经过打字与印刷如下:

$ cat log.txt

LOG FILE HEADER
This is a test log file
Function:System statistics

返回顶部