我有以下文件:
file1.text
geek
for
geeks
我正在使用tee
命令对输出执行两个操作。我的问题是关于第一个tee
之后的重定向字符。我想得到file1.text的第一列将其写入file2.txt。当我运行以下命令时,我不会收到错误,但它不会给我第一列:
wc -l file1.txt |tee awk '{print $1}' - > file2.txt | sed 's/4/6/g' > file3.txt
但是,以下命令按预期工作。>
在这里做什么?
wc -l file1.txt |tee >(awk '{print $1}' - > file2.txt) | sed 's/4/6/g' > file3.txt
tee awk '{print $1}' - > file2.txt
做:
- 使用3个参数
awk
、'{print $1}'
和-
执行tee
tee
将创建名为awk
的文件,另一个名为'{print $1}'
的文件,以及另一个名称为-
的文件- 然后
tee
的输出将重定向到file2.txt
tee
将重复输入到这3个文件,并将输出到file2.txt
- 因此,
| sed
将不接收任何输入,因为tee
的输出被重定向到该文件,并且子shell不输出任何内容
tee >(awk '{print $1}' - > file2.txt)
执行:
>(...)
- 使用两个参数
'{print $1}'
和-
运行awk
- ------
'{print $1}'
被解释为脚本 - ------
-
被解释为stdin(可以省略( - ------则的CCD_ 24的输出重定向到CCD_
- 然后
bash
创建一个fifo或/dev/fd/something
文件 - 然后该文件的输出连接到
awk
进程的stdin >(awk ...)
被替换为文件名,很可能是/dev/fd/something
- 使用两个参数
tee >(...)
- 使用一个参数执行tee,如
tee /dev/fd/something
/dev/fd/something
连接到另一侧的awk进程- 因此
tee
写入/dev/fd/something
,awk
从另一侧的stdin读取数据 - CCD_ 37的输出被重定向到CCD_
- 使用一个参数执行tee,如
什么是>在这里干什么?
第一次出现用于引入进程替换。第二次出现用于将awk
命令的输出重定向到名为file2.txt
的文件。第三次出现用于将sed
命令的输出重定向到名为file3.txt
的文件。
这里,进程替换用于捕获通常会进入文件的输出
写入进程的Bash语法是>(command)