如何判断使用重定向运算符向命令提供了哪个参数?

如何判断使用重定向运算符向命令提供了哪个参数?

这有效:

$ echo“notify-send HELLO”|现在

这不:

$ at now < echo“通知发送 HELLO”

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

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

所以这让我开始思考......一般来说,我如何知道重定向运算符为哪个参数提供值?

答案1

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

  1. |:这是管道操作符,它的作用是将一个进程的输出作为另一个进程的输入传递:

    foo | bar
    

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

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

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

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

    • foo < bar:运行foo,告诉它从文件 bar

    • <<是一个特殊情况,因为没有必要将输入“附加”到命令中,因此<<主要(仅据我所知)用于此处有文件

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

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

  3. 运营<<<商、这里字符串,类似于 Here Document,但它扩展了变量。例如:

    grep foo <<< "$bar"
    

    上述命令等同于echo "$bar" | grep foo

  4. 你真正要寻找的是流程替代是将一个命令的输出传递给另一个命令的另一种方法。它由 组成<(command)

    foo <(bar) 
    

    因此,对于你的at例子,你可以这样做

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

    上述方法有效,因为进程替换实际上创建了一个文件(阅读上面的链接了解更多详细信息),并且该文件的文件描述符与<to一起传递at now


1默认行为是覆盖,可以通过将noclobber选项设置为 bash 来修改。如果设置,echo foo > bar则如果存在则会失败bar。在这种情况下,可以强制使用它echo foo |> bar。请参阅第 3.6.2 节这里

答案2

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

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

你也可以使用这里是字符串echo完全避免命令

at now <<< "notify-send HELLO"

相关内容