7

我最近遇到了一个看起来像这样的 shell 命令:"> outfile < infile cat",它在功能上似乎等同于 "cat infile > outfile"。就此而言,一般形式似乎是“> outfile < infile command arg1 ... argN”变为“command arg1 ... argN infile > outfile”。

无论如何,我想知道是否有人可以详细说明领先的“>”如何实现这种效果,以及它是否有任何实际用途。

4

5 回答 5

6

Bash 参考手册”对重定向运算符进行了以下说明:

以下重定向操作符可以在简单命令之前或出现在任何地方,也可以在命令之后。

所以下面的命令都是等价的:

ls -al > listing.txt
> listing.txt ls -al
ls > listing.txt -al

虽然我猜第一种是最常见的形式。

请注意,重定向的相对顺序很重要,因此,例如,如果您将一个文件描述符重定向到另一个文件描述符,则以下内容会有所不同:

ls > listing.txt 2>&1   # both stdout and stderr go in to listing.txt

ls 2>&1 > listing.txt   # only stdout goes to listing.txt, because stderr was made
                        #    a copy of stdout before the redirection of stdout
于 2012-04-17T06:12:59.640 回答
4

">" 只是将命令的输出重定向到作为下一个参数给出的文件。典型的用途是在命令末尾附加它,但它可以在任何地方。所以:

> outfile <command>相当于 <command> > outfile。输入重定向也是如此。

请注意,在上面的例子<command>中并不是一些奇怪的语法——它只是替换了任意命令。

于 2012-04-17T05:48:32.303 回答
1

等价的不是:

cat infile > outfile

相反,它是

cat < infile > outfile

(只是在猫的情况下,cat infile与 相同cat <infile

一旦你这样看,原来的命令看起来就更简单了。

于 2012-04-17T05:52:12.693 回答
1

一注。这是因为你实际上可以写这个

< file command

它使 Cat 的无用使用更加不可原谅:

cat file | command

也就是说,即使出于某种原因您希望文件在语法上位于命令的左侧,您仍然不需要cat!

于 2012-04-17T18:43:37.580 回答
0

前导大于号 (>) 用于重定向输出。默认情况下,它将重定向 STDOUT。在这种情况下,STDOUT 是空的,因此会创建一个新的空文件(效果类似于touch output)。

您也可以使用这种风格的命令来清空现有文件,即

    $ echo FOO >/tmp/foo
    $ ls -l /tmp/foo
    -rw-r--r--  1 flah  wheel  4 Apr 17 01:49 /tmp/foo
    $ > /tmp/foo
    $ ls -l /tmp/foo
    -rw-r--r--  1 flah  wheel  0 Apr 17 01:49 /tmp/foo
    $ 

有关更多信息,请参阅 bash 手册页的重定向部分。

于 2012-04-17T05:52:24.913 回答