当我运行命令时:
猫 < foo > foo
由于foo是一个 atribary 文件,我认为foo将保持不变,因为我们将foo作为cat命令的输入和输出。但事实证明,这个命令擦除foo。否则,如果我将输入重定向到bar by
猫 < foo > 酒吧
然后我得到bar是foo的副本。我想不通为什么?我在这里缺少什么?
当我运行命令时:
猫 < foo > foo
由于foo是一个 atribary 文件,我认为foo将保持不变,因为我们将foo作为cat命令的输入和输出。但事实证明,这个命令擦除foo。否则,如果我将输入重定向到bar by
猫 < foo > 酒吧
然后我得到bar是foo的副本。我想不通为什么?我在这里缺少什么?
将输出重定向到文件是由运行命令的 shell 完成的,它会导致文件的内容被完全擦除,这正是您在第一个命令中看到的内容。第二个命令创建一个新文件bar
(或覆盖它)。
壳牌不知道也不关心做什么cat
。它所知道的只是它应该运行cat
并使其从一个文件读取输入并重定向到另一个文件。
如果您想用命令的输出替换文件foo
内容,最便携的方法是使用临时文件。下面是它的骨架:
tmpfile=..... # temporary name - see mktemp for portable secure ways to create it!
cat < foo > $tmpfile
mv $tmpfile foo