shell的<, <<, <<&l

作者: CodingCode | 来源:发表于2018-10-07 12:04 被阅读3次

    shell的<, <<, <<<操作符

    我们先看一个例子

    定义一个文本文件:

    $ cat a.txt
    AABBCC in file a.txt
    

    使用sed命令操作文本文件:

    $ cat t.sh
    #!/bin/bash
    
    sed -e "s/BB//" a.txt
    sed -e "s/BB//" < a.txt
    sed -e "s/BB//" << a.txt
    AABBCC in inline file a.txt
    a.txt
    sed -e "s/BB//" <<< "AABBCC in variable"
    

    运行结果:

    $ ./t.sh
    AACC in file a.txt
    AACC in file a.txt
    AACC in inline file a.txt
    AACC in variable
    

    分析

    在t.sh里面调用了4次sed命令,每次命令的最后一个参数不一样。

    1. a.txt
      以文件a.txt作为sed的输入。

    2. < a.txt
      以stdin作为sed的输入,stdin输入的内容从a.txt里面获取。

    3. <<a.txt
      以stdin作为sed的输入,stdin输入的内容从脚本内<<a.txt和a.txt之间的inline内容获取。

    4. <<< "AABBCC in variable"
      以stdin作为sed的输入,stdin的内容就是<<<后面的字符串内容。

    命令1和命令2,3,4不同之处是命令1以指定文件作为输入,而命令2,3,4以标准输入stdin作为输入内容。

    至于一个命令是从标准输入stdin获取输入,还是从输入文件获取输入,还是从命令行获取输入,这是由命令工具本身决定的。我们还是以sed为例,假如sed命令同时从文件和标准输入文件stdin都提供了输入,那么sed会怎么处理呢?

    $ cat a.txt
    AABBCC in file a.txt
    $ cat b.txt
    AABBCC in file b.txt
    $ sed -e "s/BB//" a.txt < b.txt
    AACC in file a.txt
    $ sed -e "s/BB//" b.txt < a.txt
    AACC in file b.txt
    

    看明白了吗,如果同时提供两种输入,sed使用输入文件作为输入的,这是sed命令本身的处理逻辑,大致如下:

    if 有输入文件; then
       处理输入文件内容
    else if 标准stdin有数据; then
       处理stdin文件内容
    else
       报错啥的
    fi
    

    最后提到前面的命令2,3,4处理stdin的不同方式,这些都是调用者shell处理的,不是sed命令处理的,即sed的调用这把这些数据都分析整理好,然后丢给sed的标准输入文档stdin,然后sed就读取stdin就可以了。

    结论就是

    1. "< VAR"
      VAR标识的是一个文件名,从所标识的文件读取内容,传递给命令的stdin。
    2. "<< VAR"
      VAR是一个标记,从当前脚本的inline读取内容,一直到再次遇到VAR标识符为止,传递给命令的stdin。
    3. <<< VAR
      VAR是一个变量,直接读取变量的内容,传递给命令的stdin。

    具体能不能用<<<操作符,还依赖于待调用的命令本身,其是否支持从stdin读取数据。

    相关文章

      网友评论

        本文标题:shell的<, <<, <<&l

        本文链接:https://www.haomeiwen.com/subject/adclaftx.html