玩Linux文件描述符和重定向
Linux下的文件描述符是一个与文件的输入和输出相关联的整数,用于跟踪打开的文件。
最常见的文件描述符stdin,stdout和stderr,。,我们可以将一个文件描述符指向另一个文件描述符的内容。
下面给出了文件描述符的操作和重定向的一些例子。
1.5.1预备知识
我们经常使用的标准输入(stdin)、标准输出(stdout),和标准错误(stderr)当我们写剧本。
我们的基本任务之一是通过内容过滤将输出重定向到文件。
当命令输出文本时,这些输出文本可能是错误信息,也可以是正常(非错误)输出信息。
通过单独查看输出文本,我们无法区分什么是正常输出文本和哪一个文本是错误的,但是,我们可以通过使用文件描述符来提取与特定描述符相关联的文本来解决这个问题。
文件描述符是一个与打开的文件或数据流相关联的整数。文件描述符0, 1和2是为系统保留的。
0mdash;mdash;stdin(标准输入)
1mdash;mdash;stdout(标准输出)
2mdash;mdash;stderr(标准误差)
1.5.2实践演练
重定向输出文本或将其保存到文件中:
复制代码代码如下所示:
$ echo这是一个示例文本1>下的TEMP.TXT
这种方式节省了输出文本文件下的TEMP.TXT通过截获的文件,也就是说,在echo命令的输出写入到文件中的内容将被清空,第一下的TEMP.TXT。
接下来,看看另一个例子。
复制代码代码如下所示:
这是$ echo 2 > >下的TEMP.TXT示例文本
这种方法将文本到目标文件。
> >与>不一样。虽然这两个操作符可以将文本重定向到文件,但前者将先清空文件,然后写入内容。后者将内容追加到现有文件的结尾。
可以使用以下方法查看文件的内容:
复制代码代码如下所示:
猫下的TEMP.TXT美元
这是示例文本1。
这是示例文本2。
在Linux操作系统中,当使用重定向操作符时,重定向的内容不会出现在终端上,而是直接导入到文件中。重定向运算符默认使用标准输出。如果要使用特定的文件描述符,则必须将描述符放在操作器前面。
>等于1 >;对于>,情况类似(即>等于1 >)。
看一个标准误差是什么和如何重定向。当命令输出的错误信息,错误的信息打印出来。请看下面的例子:
复制代码代码如下所示:
$ +
是:不能访问+:没有这样的文件或目录
这里,+是一个非法参数,因为有些将返回错误消息。
{成功和不成功的订单
当一个命令出错并返回时,它返回一个非0个退出状态;当命令成功完成时,它返回一个0的数字。退出状态可以从特殊变量$(在命令执行语句之后立即运行回声$,并且可以打印出出口状态)}。
打印stderr文本到屏幕上,不在文件。
复制代码代码如下所示:
$ > out.txt
是:不能访问+:没有这样的文件或目录
在下面的命令,但是,它没有输出,因为被重定向到out.txt误差。
复制代码代码如下所示:
$ + 2 > out.txt #正常运行
你可以将stderr重定向到一个文件,将标准输出重定向到另一个文件:
复制代码代码如下所示:
> 1 > 2美元stderr.txt stdout.txt CMD
你也可以使用下面的方法来转换成标准输出,标准错误,stderr和stdout重定向到相同的文件:
复制代码代码如下所示:
2 > 1 output.txt CMD美元
或采用以下方法:
复制代码代码如下所示:
CMD > output.txt美元
有时,可能会有一些不必要的信息(如错误信息)的输出。如果你不想让终端对远端分支的标准,那么你可以重定向标准错误输出/ dev /空,以确保一切都会被清理。假设我们有三A1、A2、A3文件,但普通用户没有A1;读写和执行的权限。如果您需要打印的文件名的所有文件,开始的,你可以使用cat命令。
设置一些测试文件:
复制代码代码如下所示:
回波A1 A1
CP;
$ chmod 000 A1 #清除所有权利
虽然A *可以用来显示文件的所有内容,但是系统显示错误消息,因为文件A1没有可读的权限。
复制代码代码如下所示:
美元A *
猫:A1拒绝许可
A1
A1
其中,猫:A1:权限被拒绝属于STDERR。我们可以重定向标准错误信息到一个文件中,并且输出保持不变。考虑下面的代码:
复制代码代码如下所示:
为猫* 2 > err.txt # stderr重定向到err.txt
A1
A1
猫err.txt美元
猫:A1:拒绝许可
请看下面的代码:
复制代码代码如下所示:
some_command美元2 > / dev /空
本节是播放linux文件描述符和重定向第二页的内容,欢迎继续阅读。
在这个例子中,从stderr输出输给文件 / dev /空。 / dev /零是一个特殊的设备文件,以及任何数据文件将会被丢弃。
因此,空设备通常也被用作位桶或黑洞。
当重定向stderr或stdout,重定向的文本会被传递到文件。
因为文字已被重定向到一个文件,没有留下什么可以通过管道(|)以下的订单,这些订单是通过标准输入接收文本。
但是有一个聪明的方法可以将数据重定向到文件。另一方面,它可以提供数据作为后续命令重定向stdin拷贝。
所有这些都可以用三通实现。
例如,在标准输出打印终端和重定向到一个文件中,你可以使用TEE:这样
复制代码代码如下所示:
命令TEE file1 file2 |
在下面的代码中,tee命令从标准输入设备接收数据,写一份stdout的文件out.txt,同时另一份为stdin的遵循了命令。命令猫N加在每行收到来自stdin数据的行数和写入标准输出:
复制代码代码如下所示:
猫* | TEE美元了。txt |猫n
猫:A1:拒绝许可
1 A1
2 A1
看看out.txt内容:
复制代码代码如下所示:
猫out.txt美元
A1
A1
注意,猫:A1:权限被拒绝并没有出现在任何文件的内容。这是因为信息属于内部和TEE只能读取输入。
默认情况下,tee命令覆盖文件,但提供了一个一个的选项,可以用来添加内容。例如:
复制代码代码如下所示:
猫|美元* T恤一个.txt |猫N.
带参数的命令可以写成:命令file1 file2又是类似的,或简单地使用命令文件。
我们可以使用标准输入作为命令参数,只需要将该命令的文件名参数:
复制代码代码如下所示:
cmd1 cmd2美元| | CMD—
例如:
复制代码代码如下所示:
这是谁的T恤| $ echo
是谁啊
是谁啊
或者我们可以使用 / dev /标准输入作为输出文件的名称使用标准输入。
同样, / dev / stderr代表标准错误使用,和 / dev / stdout表示标准输出。这些特殊的设备文件对应stdin,stdout和stderr,分别。
补充内容:
该命令从标准输入读取输入可以多种方式接收数据。此外,我们也可以用猫和管道使我们自己的文件描述符,如:
复制代码代码如下所示:
猫|美元文件cmd
| cmd1 cmd2美元
1。将文件重定向到命令
重定向,我们可以从标准输入读取数据文件:
复制代码代码如下所示:
$ <文件
2。脚本内部的重定向文本块
有时,需要像标准输入那样重定向文本块(多行文本)。考虑一个特殊情况:源代码位于shell脚本中。
查看下面的shell脚本并将头部数据写入日志文件,您可以如下所述:
复制代码代码如下所示:
# /斌/狂欢!
猫log.txt
日志文件头
这是一个测试日志文件。
功能:系统统计
EOF
猫log.txt和下一个EOF线之间的所有文本行被视为输入的数据。的log.txt文件打印如下内容:
复制代码代码如下所示:
猫log.txt美元
日志文件头
这是一个测试日志文件。
功能:系统统计