假设我执行以下命令:
tr a-z A-Z < file > file
有两个重定向:< file
和> file
。两者都在tr
命令之前进行处理,据我所知,如果存在多个重定向,则它们将从左到右进行处理。换句话说< file
,然后是> file
。这是否< file
仅表示如果命令启动,那么该命令stdin
来自名为的文件file
?然后> file
处理零件,这意味着将输出发送到名为的文件file
。同样,名为的文件将file
被截断为零大小。现在终于启动了命令(tr
在我的示例中),但是由于在上一步中将输入文件截断为零,那么它只是处理一个空文件吗?
这是正确的。>
在启动命令之前将文件截断,因此命令会看到一个空的输入文件。从左到右执行重定向实际上并不重要(除非文件不存在,否则会出现错误,而>file <file
首先会创建文件)。
使用时somecommand <file >>file
,大多数情况下,当命令读取其自己的输入时,您将获得一个无限循环。但是,对于短文件,该命令可能会在写完任何内容之前检测到输入的结尾,在这种情况下,其行为就像输入和输出是单独的文件一样。
使用somecommand <file 1<>file
,则更为复杂。根据命令是扩展还是缩小文件,它可能会在自己的输入上循环,也可能不会循环。如果命令总是缩小文件(例如,grep
没有行号或颜色之类的东西),即,如果输出的字节N始终仅取决于输入的字节0..N-1,则这表现为两个文件不同。但我不建议您依赖它:它在许多方面都很脆弱,如果在中间中断该命令,则会造成混乱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句