shell的<, <<, <<&l
2018-10-07 本文已影响3人
CodingCode
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命令,每次命令的最后一个参数不一样。
-
a.txt
以文件a.txt作为sed的输入。 -
< a.txt
以stdin作为sed的输入,stdin输入的内容从a.txt里面获取。 -
<<a.txt
以stdin作为sed的输入,stdin输入的内容从脚本内<<a.txt和a.txt之间的inline内容获取。 -
<<< "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就可以了。
结论就是
- "< VAR"
VAR标识的是一个文件名,从所标识的文件读取内容,传递给命令的stdin。 - "<< VAR"
VAR是一个标记,从当前脚本的inline读取内容,一直到再次遇到VAR标识符为止,传递给命令的stdin。 - <<< VAR
VAR是一个变量,直接读取变量的内容,传递给命令的stdin。
具体能不能用<<<操作符,还依赖于待调用的命令本身,其是否支持从stdin读取数据。