带有重定向的tee-bash命令



我有以下文件:

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/somethingawk从另一侧的stdin读取数据
    • CCD_ 37的输出被重定向到CCD_

什么是>在这里干什么?

第一次出现用于引入进程替换。第二次出现用于将awk命令的输出重定向到名为file2.txt的文件。第三次出现用于将sed命令的输出重定向到名为file3.txt的文件。

这里,进程替换用于捕获通常会进入文件的输出

写入进程的Bash语法是>(command)

最新更新