我的目录有四个文件:
1 2 3 4
然后我运行命令
ls | tee >(ls) | more
它会打印
1
3
2
4
1
2
3
4
但是当我跑步时
ls | tee>(echo hello) | more
只有
hello
为什么呢?在第一个命令中,第一个ls的结果将被定向到更多,第二个ls的结果也将被定向到更多。 但是在第二个命令中,为什么ls的结果不会被引导到更多?
顺便说一句,>意思?
答案 0 :(得分:5)
通常>
是用于将标准输出重定向到文件的运算符。在这里,它使用了称为process substitution的Bash功能,它允许您将进程的标准输入或输出替换为预期的输出文件或输入文件(分别)。
通常,tee
会将其标准输入写入您告诉它的文件名及其标准输出。它有效地将“T”放入数据管道中。
foo | tee foo.out | bar
结果:
foo --> tee --> bar
|
V
foo.out
进程替换是Bash的一个特性,它使shell打开一个命名管道,代替文件替换你的进程,并传递该命名管道代替文件名。例如:
diff <(echo hello) <(echo goodbye)
结果
echo hello > /dev/fd/63 &
echo hello > /dev/fd/62 &
diff /dev/fd/63 /dev/fd/62
ls | tee >(ls) | more
无所谓,因为ls
甚至没有查看其标准输入。所以你有:
ls < /dev/fd/63 & # which never gets read
ls --> tee --> more
|
V
/dev/fd/63
首先,您会看到括号中的ls
输出您的目录列表(它永远不会读取您提供的stdin)。然后,您会看到more
打印第一个ls
的输出。 tee
的输出已丢失,因为您已将其发送给其他ls
。结果? ls
的输出两次。
答案 1 :(得分:0)
如果我有目录1,2,3,4
然后是命令
ls |发球区域
显示
1
2
3
4
tee命令用于显示标准输出。
然后运行
LS |三通&LT; FILE2.TXT
上面的命令将输出重定向到file2.txt
打开文件fil2.txt
vim file2.txt
你会看到以下输出
1
2
3
4
FILE2.TXT