当使用Bash重定向到多个文件时出现"模棱两可的重定向(Ambiguous redirect)"问题

14
$ echo "" >  /home/jem/rep_0[1-3]/logs/SystemOut.log
bash: /home/jem/rep_0[1-3]/logs/SystemOut.log: ambiguous redirect

我可以同时重定向到多个文件吗?

编辑:是否有任何答案允许使用模糊的文件参考?

6个回答

25

这就是 tee 命令的作用:

command | tee file1 file2 file3 > file4

tee命令也会输出到标准输出,因此你可能想要在重定向之后放置一个文件(如上所示),或将标准输出发送到/dev/null

对于你的情况:

echo "" | tee /home/jem/rep_0[1-3]/logs/SystemOut.log >/dev/null

还可以在嵌入式设备上使用,例如关闭路由器上的所有LED:echo none|tee /sys/class/leds/*/trigger; echo 0|tee /sys/class/leds/*/brightness - eMPee584

5
你可以使用 tee,它可以从标准输入读取并将其写入标准输出和文件中。由于 tee 还会输出到标准输出流,因此我选择将其输出重定向到 /dev/null。请注意,Bash扩展会与现有文件匹配,所以在执行此命令之前,你要写入的文件必须存在。
$ echo "" | tee /home/jem/rep_0[1-3]/logs/SystemOut.log > /dev/null

作为附注,你传递给 echo"" 是多余的。
虽然与你的问题不直接相关,但如果你不依赖于 bash 扩展,那么可以有多个管道。
$ echo hello > foo > bar > baz
$ cat foo bar baz
hello
hello
hello

3

我曾经也有同样的问题,只是想补充一下通配符的示例,因为它还没有被展示出来。我认为这就是你所寻找的:

echo "" | tee *.log

完美,正是我所需要的。 - PoweredByRice

1
你可以这样做:
echo "" | tee /home/jem/rep_0{1..3}/logs/SystemOut.log

为了抑制标准输出,将此代码添加到上述命令的末尾:
> /dev/null

你问题中的echo命令(不需要空引号)只是在文件中插入一个换行符。如果你想创建空文件,请使用touch命令。


不仅仅是输出,它还会用换行符覆盖原有内容。 - Brad Koch

0

不行。那使用两次tee怎么样?

echo "Your text" | tee file1 | tee file2 > file3

谢谢。我忘记指定我想要使用通配符文件引用。 - Synesso
1
你可以指定多个参数给 tee。你不需要运行两次。 - Dennis Williamson
1
@ Dennis - 不知道那个。每天学点新东西! - Robert

0

使用管道将数据传输到“tee”命令,以分支输出到文件和标准输出,然后级联多个tee命令。


谢谢。我忘了指定我想要使用通配符文件引用。 - Synesso
1
你可以指定多个参数给 tee 而不是级联它们。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接