带重定向的 tee bash 命令

tee bash command with redirection

我有以下文件:

file1.txt

geek
for
geeks

我正在使用 tee 命令对输出执行两个操作。我的问题是关于第一个 tee 之后的重定向字符。我想获得 file1.txt 的第一列和 将其写入 file2.txt。当我 运行 以下命令时,我没有收到错误,但它没有给我第一列:

wc -l file1.txt |tee awk '{print }' - > file2.txt | sed 's/4/6/g' > file3.txt

但是,以下命令按预期工作。 > 在这里做什么?

wc -l file1.txt |tee >(awk '{print }' - > file2.txt) | sed 's/4/6/g' > file3.txt

此处,进程替换用于捕获通常会转到文件的输出

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

tee awk '{print }' - > file2.txt 

会:

  • 使用 3 个参数 awk'{print }' 以及 -.
  • 执行 tee
  • tee 创建一个名为 awk 的文件, 另一个名为 '{print }' 的文件 和另一个名为 -.
  • 的文件
  • 然后tee的输出会被重定向到file2.txt
  • tee 将复制输入到这 3 个文件,并将输出到 file2.txt
  • 因此 | sed 将接收不到任何输入,因为 tee 的输出被重定向到文件,子 shell 什么也不输出。

tee >(awk '{print }' - > file2.txt)

会:

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

What does the > is doing here?

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

的文件