Unix 输入重定向与输出重定向相同

Unix 输入重定向与输出重定向相同,unix,io-redirection,Unix,Io Redirection,当我运行命令时: 猫foo 由于foo是一个atribary文件,我认为foo将保持不变,因为我们将foo作为cat命令的输入和输出。但事实证明,这个命令可以擦除foo。否则,如果我将输入重定向到栏 猫酒吧 然后我得到了条是foo的副本。我不明白为什么?这里我缺少什么?将输出重定向到文件是由运行命令的shell完成的,它会导致文件内容被完全擦除,这正是第一个命令所看到的。第二个命令创建一个新文件bar(或覆盖它) Shell不知道或不关心cat所做的事情。它所知道的是,它应该运行cat,让它从一

当我运行命令时:

foo

由于foo是一个atribary文件,我认为foo将保持不变,因为我们将foo作为cat命令的输入和输出。但事实证明,这个命令可以擦除foo。否则,如果我将输入重定向到

酒吧


然后我得到了foo的副本。我不明白为什么?这里我缺少什么?

将输出重定向到文件是由运行命令的shell完成的,它会导致文件内容被完全擦除,这正是第一个命令所看到的。第二个命令创建一个新文件
bar
(或覆盖它)

Shell不知道或不关心cat所做的事情。它所知道的是,它应该运行
cat
,让它从一个文件读取输入并重定向到另一个文件

如果要用命令的输出替换文件
foo
内容,最方便的方法是使用临时文件。下面是它的框架:

tmpfile=.....  # temporary name - see mktemp for portable secure ways to create it!
cat < foo > $tmpfile
mv $tmpfile foo
tmpfile=临时名称-有关创建它的可移植安全方法,请参阅mktemp!
猫$tmpfile
mv$tmpfile foo