是否可以使用相同的输入文件作为管道命令的输出?

Amr*_*mro 32 unix linux bash shell pipe

考虑类似的事情:

cat file | command > file
Run Code Online (Sandbox Code Playgroud)

这是好习惯吗?这可能会在我们读取输入文件的同时覆盖输入文件,还是始终先在内存中读取然后通过管道传输到第二个命令?

显然,我可以使用临时文件作为中间步骤,但我只是想知道..

t=$(mktemp)
cat file | command > ${t} && mv ${t} file
Run Code Online (Sandbox Code Playgroud)

Jul*_*ano 46

不,不行.管道中的所有命令同时执行,并且shell在执行命令之前准备重定向.因此,在cat读取之前,该命令很可能会覆盖该文件.

你需要来自moreutils的海绵(1).

  • 是的,它也适用于这两种情况.请记住,shell可以按任意顺序自由设置重定向,因此您应该考虑未定义的行为,以便在单个命令或管道中访问同一文件两次.即使它偶尔起作用,也不能保证. (2认同)