带有重定向的tee bash命令

问题描述

我有以下文件

file1.txt

geek
for
geeks

我正在使用tee命令对输出执行两项操作。我的问题是关于第一个tee之后的重定向字符。我想获取file1.txt的第一列,然后 将其写入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个自变量teeawk'{print $1}'执行-
  • tee创建一个名为 awk的文件,另一个名为'{print $1}'的文件和另一个名为{{1}的文件}。
  • 然后,-的输出将重定向到tee
  • file2.txt将输入重复到这3个文件,并将输出到tee
  • 因此,file2.txt将不会收到任何输入,因为| sed的输出将重定向到该文件,并且子shell不会输出任何内容。

tee

这样做:

  • tee >(awk '{print $1}' - > file2.txt)
    • 使用两个参数>(...)awk运行'{print $1}'
    • ------ -被解释为脚本
    • ------ '{print $1}'被解释为stdin(可以省略)
    • ------然后将-的输出重定向到awk
    • 然后file2.txt创建一个fifo或bash文件
    • 然后将该文件的输出连接到/dev/fd/something进程的stdin
    • 然后awk被替换为文件名,{em>最可能被替换为>(awk ...)
  • /dev/fd/something
    • 使用一个参数执行tee,例如tee >(...)
    • tee /dev/fd/something已连接到另一端的awk进程
    • 因此/dev/fd/something写入tee,而/dev/fd/something从另一侧的stdin读取数据
    • awk的输出重定向到tee

>在这里做什么?

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

,

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

用于写入进程的Bash语法为>(command)