redirect - 在 UNIX 中什么是 "cat file1 > file1 does?"

标签 redirect unix

当命令的输出重定向到文件时,输出文件会在执行命令之前由 shell 创建或截断,知道 cat foo > foo 会做什么吗?

最佳答案

在所有情况下,文件都会被截断。这是因为重定向是由 shell 处理的,它会在调用命令之前打开文件进行写入。

cat foo > foo

shell 截断并打开 foo 进行写入,将 stdout 设置为文件,然后执行 exec 的 ["cat", "foo"]

GNU cat 很聪明,拒绝将文件重定向到自身。它通过检查输入和输出文件描述符上的设备/ inode 对来实现这一点;您可以在src/cat.c中阅读精彩的底层细节。 。它打印一条消息并退出。

BSD cat 没有这样的安全性,但是由于文件已经被截断,所以没有东西可读,没有东西可写,并且它会停止。

<小时/>

您可以通过附加而不是截断来让事情变得有趣一点。

echo hello > foo
cat foo >> foo

现在一切都一样了,只是 shell 打开文件进行追加而不是截断它。

GNU 猫看到你在做什么并停下来;文件未受影响。

BSD cat 进入循环并将文件追加到自身,直到磁盘填满。

关于redirect - 在 UNIX 中什么是 "cat file1 > file1 does?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3887771/

相关文章:

java - 如何在 JSF2 中使用参数重定向?

html - django表单发布到另一个表单

macos - Bash pwd 并打开管道不工作

linux - 多字符串命令输出只保存一串

redirect - 如何获取show.gsp参数并将其传递给另一个 Controller

redirect - Nginx 在位置下返回

java - Spring Controller 重定向到另一个页面

c++ - "high involuntary context"开关是什么意思?

linux - 比较两个文件并合并数据

ruby - Gem 开发工作流程