【发布时间】:2012-04-17 05:43:57
【问题描述】:
我最近遇到了一个看起来像这样的 shell 命令:"> outfile outfile”。就此而言,一般形式似乎是 "> outfile outfile"。
无论如何,我想知道是否有人可以详细说明领先的“>”如何实现这种效果,以及它是否有任何实际用途。
【问题讨论】:
-
为什么这被否决了?这是个好问题。
我最近遇到了一个看起来像这样的 shell 命令:"> outfile outfile”。就此而言,一般形式似乎是 "> outfile outfile"。
无论如何,我想知道是否有人可以详细说明领先的“>”如何实现这种效果,以及它是否有任何实际用途。
【问题讨论】:
"Bash Reference Manual" 对重定向运算符有如下说明:
以下重定向操作符可以在简单命令之前或出现在任何地方,也可以在命令之后。
所以下面的命令都是等价的:
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> 并不是什么奇怪的语法——它只是替换了任意命令。
【讨论】:
> OUTFILE COMMAND, > %outfile% %command%, > $outfile $command
dir="$(mktemp -d)"; > "$dir"/test.txt ls
等价的不是:
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 手册页的重定向部分。
【讨论】: