【问题标题】:Shell Command Starting with ">"以“>”开头的 Shell 命令
【发布时间】:2012-04-17 05:43:57
【问题描述】:

我最近遇到了一个看起来像这样的 shell 命令:"> outfile outfile”。就此而言,一般形式似乎是 "> outfile outfile"。

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

【问题讨论】:

  • 为什么这被否决了?这是个好问题。

标签: bash shell


【解决方案1】:

"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

【讨论】:

    【解决方案2】:

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

    > outfile <command> 等价于<command> > outfile。输入重定向也是如此。

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

    【讨论】:

    • 你可能不应该在你神话般的“命令”周围使用尖括号——这会让这个例子有些混乱。
    • @MichaelBurr 是的,我想到了这一点,但想不出更好的格式。
    • > OUTFILE COMMAND, > %outfile% %command%, > $outfile $command
    • 不如用一个真实的例子方便阅读:dir="$(mktemp -d)"; > "$dir"/test.txt ls
    【解决方案3】:

    等价的不是:

    cat infile > outfile
    

    其实是

    cat < infile > outfile
    

    (只是在猫的情况下,cat infilecat &lt;infile 相同)

    一旦你这样看,原来的命令似乎更直接。

    【讨论】:

      【解决方案4】:

      一个音符。因为你真的可以写这个

      < file command
      

      这让 Cat 的无用使用变得更加不可原谅:

      cat file | command
      

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

      【讨论】:

        【解决方案5】:

        前导大于号 (>) 用于重定向输出。默认情况下,它将重定向 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 手册页的重定向部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-07
          • 2016-03-18
          • 2018-07-27
          • 2012-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多