【问题标题】:what's this bash redirection operator? "<<!"这个 bash 重定向运算符是什么? “<<!”
【发布时间】:2012-08-06 22:56:36
【问题描述】:

我看到了以下 bash 代码:at 19:00 &lt;&lt;! echo "job 1"。我有两个问题:

  1. 这个重定向运算符是什么:&lt;&lt;!
  2. 我编写了以下脚本代码:

    at 19:00 <<!
        echo "job 1"
    
    at 20:00 <<!
        echo "job 2"
    

    当我执行这个脚本时,atq 命令只显示了一个作业,第一个。怎么了?我应该如何通过这个脚本正确提交这两个作业?

【问题讨论】:

    标签: bash


    【解决方案1】:

    来自bash reference manual

    3.6.6 这里的文档

    这种类型的重定向指示 shell 从当前源读取输入,直到看到只包含单词(没有尾随空格)的行。然后将所有读取到该点的行用作命令的标准输入。

    The format of here-documents is: 
         <<[−]word
                 here-document
         delimiter
    

    所以

    1. 您不需要在word(在您的情况下为!)之后指定任何内容
    2. 那么你应该在一行或多行上指定at job
    3. 最后,添加一行包含word(同样是!

    【讨论】:

    • 请注意,I/O 重定向,包括此处的文档,可以出现在命令行的任何位置。因此,例如:&lt;file1 &gt;&gt;file2 sed s/x/y/g 完全等同于 sed s/x/y/g &lt;file1 &gt;&gt;file2。管道略有不同;它标记了两个命令之间的边界。但是,您可以写sed s/x/y/g &lt;&lt;! | another-command(后面是此处的文档)。或者您可以在管道之后将another-command 关闭,在这种情况下,接下来是此处的文档,然后是输出管道的命令。
    【解决方案2】:

    正如 Nya 解释的那样,&lt;&lt;!here document

    你应该写:

    at 19:00 <<!
        echo "job 1"
    !
    at 20:00 <<!
        echo "job 2"
    !
    

    如果没有以! 开头的行,您的here 文档就是shell 脚本的其余部分,这就是atq 中只有一个命令的原因。 (但是,该命令在运行时会安排第二个作业!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 2012-01-19
      • 2016-03-07
      • 2015-01-22
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多