如何使用redirectioin运算符确定将哪个参数提供给命令?


9

这有效:

$ echo“通知发送HELLO” | 现在

这不是:

$现在<echo“ notify-send HELLO”

它说“找不到文件或目录”。

我知道-f此命令有一个选项,通过它我可以提供在给定时刻要执行的文件。

因此,这让我开始思考...总的来说,我如何知道重定向运算符为哪个参数提供值?


5
您的问题不是很清楚。您所说的“哪个参数”是什么意思。您的问题可能是您(错误地)认为foo | barbar < foo等同。他们不是。
terdon

Answers:


16

您在这里使用两种不同的东西,应该使用第三种。让我们来看看:

  1. |:这是管道运算符,用于将一个过程的输出作为输入传递给另一个过程:

    foo | bar

    这将运行程序foo,并将其输出作为输入传递给程序bar

  2. ><>><<:这是重定向操作符,它们用于从数据发送到/ 文件

    • foo > bar:运行程序foo并将其输出保存到文件中 bar覆盖1的内容并创建(如果不存在)。

    • foo >> bar:运行程序foo并将其输出保存到文件中 bar,并追加到其内容中并创建(如果不存在)。

    • foo < bar:运行foo,告诉它从文件中 读取输入bar

    • <<是一种特殊情况,因为在命令的“附加”输入中没有意义,所以<<它主要(唯一地是AFAIK)用于Here Documents

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      构造<< SomeStringHere > Out.file将重定向所有写入的文本,直到遇到结尾字符串(EOF在上面的示例中)到目标文件。在这里,文档可让您轻松设置多行字符串的格式,并包含变量和特殊字符。

  3. <<<操作中,这里的字符串,就像这里文档,但它扩展变量。因此,例如:

    grep foo <<< "$bar"

    上面的命令等效于echo "$bar" | grep foo

  4. 您实际上正在寻找的是进程替换,它是将命令输出传递给另一个命令的另一种方法。由组成<(command)

    foo <(bar) 

    因此,at例如,您可以

    at now < <(echo "notify-send HELLO")

    因为进程替换实际上创建了一个文件,上述工程(阅读上面的详细信息的链接),它是与通过该文件的文件描述符<at now


1默认行为是覆盖,可以通过将noclobber选项设置为bash 进行修改。如果设置,echo foo > bar将失败(如果bar存在)。在这种情况下,可以强制使用它echo foo |> bar。见3.6.2 这里


1
好答案!非常彻底(特别是包括文件重定向器之间的差异)
steeldriver 2014年

@steeldriver噢,胡说,谢谢:)等于是这个在欣赏宝石。我希望我可以为您的解决方案无声避免的各种陷阱提供+1。
terdon

您还可以扩展一下<<,以包含有关和的一些信息<<<(@steeldriver在他的回答中提到)。此外,还有更多- >>>>>><<<<<<<<<<
Aditya 2014年

@Aditya完成。不用担心,它停在<<<:)
terdon 2014年

12

在这种情况下,echo "notify-send HELLO"是一个过程不是一个文件-所以你需要一个过程替代,而不是一个文件重定向

at now < <(echo "notify-send HELLO")

您也可以使用here字符串echo完全避免使用该命令

at now <<< "notify-send HELLO"

5
看到您喜欢的问题(我也一样)后,我认为您应该花更多的时间在Unix和Linux上。我们生活和死亡的酷贝技巧那边..
terdon

@terdon:对于perl高尔夫球手来说是一样的吗?
Sylvain Pineau

1
@SylvainPineau哦,是的。非常非常:)。认真地讲,您,我和Steeldriver所喜欢的那种问题在那儿更为普遍。这个地方到处都是命令行极客其中有些 学识渊博。
terdon 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.