这有效:
$ echo“notify-send HELLO”|现在
这不:
$ at now < echo“通知发送 HELLO”
它说“未找到文件或目录”。
我知道这个命令有一个-f
选项,我可以用它提供在特定时刻要执行的文件。
所以这让我开始思考......一般来说,我如何知道重定向运算符为哪个参数提供值?
答案1
您在这里使用了两种不同的东西,应该使用第三种。让我们看看:
|
:这是管道操作符,它的作用是将一个进程的输出作为另一个进程的输入传递:foo | bar
这将运行程序
foo
并将其输出作为程序的输入传递bar
。>
、、<
和>>
:<<
这些是重定向操作符,它们用于发送数据到/从文件:foo > bar
:运行程序foo
并将其输出保存到文件bar
,覆盖1其内容,如果不存在则创建它。foo >> bar
:运行程序foo
并将其输出保存到文件bar
,追加其内容,如果不存在则创建它。foo < bar
:运行foo
,告诉它从文件bar
。这
<<
是一个特殊情况,因为没有必要将输入“附加”到命令中,因此<<
主要(仅据我所知)用于此处有文件:$ cat << EOF > file.txt > Hello World! > EOF
该构造
<< SomeStringHere > Out.file
将重定向所有写入的文本,直到遇到结束字符串(EOF
在上面的示例中)到目标文件。此处的文档允许您轻松格式化多行字符串并包含变量和特殊字符。
运营
<<<
商、这里字符串,类似于 Here Document,但它扩展了变量。例如:grep foo <<< "$bar"
上述命令等同于
echo "$bar" | grep foo
。你真正要寻找的是流程替代是将一个命令的输出传递给另一个命令的另一种方法。它由 组成
<(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 节这里。