首页 > 编程知识 正文

linux文件描述符表,windows重定向输出

时间:2023-05-04 00:30:19 阅读:170658 作者:4579

linux下的文件描述符是与文件输入和输出相关的整数。 用于跟踪打开的文件。

最常见的文件描述符是stdin、stdout和stderr。 可以将一个文件描述符的内容重定向到另一个文件描述符。

提供了一些文件描述符操作和重定向的示例。

1.5.1预备知识

我们编写脚本时经常使用标准输入(stdin )、标准输出(stdout )、标准错误(stderr )。

使用内容过滤器将输出重定向到文件是我们执行的基本任务之一。

命令输出文本时,这些输出文本可能是错误消息,也可能是正常的(非错误的)输出消息。

仅通过查看输出文本本身,无法区分哪些是普通输出文本,哪些是错误文本。 然而,通过文件描述符可以解决这个问题,并且可以提取与特定描述符相关联的文本。

文件描述符是与打开的文件或数据流相关联的整数。 文件描述符0、1和2由系统保留。

0——stdin (标准输入)

1——stdout (标准输出)

2——标准错误)。

1.5.2实战演习

要将输出文本重定向或保存到文件:

复制代码

代码是下一个:

$ echo ' thisisasampletext1' temp.txt

此方法通过剪切文件将输出文本保存到文件temp.txt中。 这意味着,在将echo命令的输出写入文件之前,temp.txt的内容首先将为空。

接下来,我们来看看另一个例子:

复制代码

代码是下一个:

$ echo ' thisissampletext2' temp.txt

此方法会将文本添加到目标文件中。

和不一样。 两个操作符都可以将文本重定向到文件,但前者先清空文件,然后再写入内容。 后者将内容添加到现有文件的末尾。

可以通过以下方式查看文件的内容:

复制代码

代码是下一个:

$cat temp.txt

this is sample text 1

this is sample text 2

在linux操作系统上,使用重定向操作符时,重定向内容不会显示在终端上,而是直接导入到文件中。 重定向操作符默认使用标准输出。 要使用特定的文件描述符,描述符必须位于操作符之前。

等于一; 对我来说,情况也差不多。

让我们看看标准的错误和如何将其重定向。 如果命令输出错误消息,则会打印stderr消息。 请考虑以下示例:

复制代码

代码是下一个:

$ Is

is : cannot access 3360 nosuchfileordirectory

这里是错误的参数,由于几个原因会返回错误消息。

成功和不成功的命令

如果命令因错误而返回,将返回到0以外的结束状态。 如果命令成功完成,将返回0的数字。 结束状态为特殊变量$? 在中获取(命令执行语句后立即使用echo$? 可以打印退出状态。)。 ]

将stderr文本打印在屏幕上而不是文件上。

复制代码

代码是下一个:

$ Is out.txt

is : cannot access 3360 nosuchfileordirectory

但是,以下命令将错误重定向到out.txt,因此stdout没有任何输出。

复制代码

代码是下一个:

$ Is 2 out.txt #正常工作

可以将stderr重定向到其他文件,将stdout重定向到其他文件。

复制代码

代码是下一个:

$ cmd 2stderr.txt 1stdout.txt

也可以使用以下方法将stderr转换为stdout,以便stderr和stdout都重定向到同一文件。

复制代码

代码是下一个:

$ cmd 21 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

2.重定向脚本内部的文本块

有时候,需要对文本块(多行文本)像标准输入一样进行重定向。考虑一个特殊情况:源文本就位于shell脚本中。

来看下面这段shell脚本吧,向log文件中写入头部数据,可以按照下面的方法完成:

复制代码

代码如下:

#!/gydds/bash

cat <log.txt

LOG FILE HEADER

This is a test log file

Function:System statistics

EOF

在cat <log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据。log.txt文件的内容打印如下:

复制代码

代码如下:

$ cat log.txt

LOG FILE HEADER

This is a test log file

Function:System statistics

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。