我最近遇到了一个看起来像这样的 shell 命令:"> outfile < infile cat",它在功能上似乎等同于 "cat infile > outfile"。就此而言,一般形式似乎是“> outfile < infile command arg1 ... argN”变为“command arg1 ... argN infile > outfile”。
无论如何,我想知道是否有人可以详细说明领先的“>”如何实现这种效果,以及它是否有任何实际用途。
“ 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
">" 只是将命令的输出重定向到作为下一个参数给出的文件。典型的用途是在命令末尾附加它,但它可以在任何地方。所以:
> outfile <command>
相当于 <command> > outfile
。输入重定向也是如此。
请注意,在上面的例子<command>
中并不是一些奇怪的语法——它只是替换了任意命令。
等价的不是:
cat infile > outfile
相反,它是
cat < infile > outfile
(只是在猫的情况下,cat infile
与 相同cat <infile
)
一旦你这样看,原来的命令看起来就更简单了。
一注。这是因为你实际上可以写这个
< file command
它使 Cat 的无用使用更加不可原谅:
cat file | command
也就是说,即使出于某种原因您希望文件在语法上位于命令的左侧,您仍然不需要cat
!
前导大于号 (>) 用于重定向输出。默认情况下,它将重定向 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 手册页的重定向部分。