gpt4 book ai didi

macos - 从 Unix cat 将文件重定向到自身时出现无限循环

转载 作者:行者123 更新时间:2023-12-02 00:37:37 29 4
gpt4 key购买 nike

我正在尝试将许可证连接到我构建的源代码的顶部。我正在使用 GNU Make。在我的规则之一中,我有:

cat src/license.txt build/3d-tags.js > build/3d-tags.js

但这似乎导致了无限循环。当我终止 cat 命令时,我一遍又一遍地看到 build/3d-tags 只是 src/license.txt 的内容?这是怎么回事?我怀疑这两个文件被连接在一起,并且 cat 的结果输出被重定向回 build/3d-tags.js。我不想追加。我使用的是 OSX,以防问题与 GNU cat 与 BSD cat 有关。

最佳答案

shell 将 cat 作为子进程启动。输出重定向 (>) 由该子进程继承作为其 stdout(文件描述符 1)。由于子进程必须在创建时继承文件描述符,因此 shell 必须在启动子进程之前打开输出文件。

因此,shell 打开 build/3d-tags.js 进行写入。此外,由于您没有附加 (>>),它会截断文件。请记住,这发生在 cat 启动之前。此时,已经无法实现你想要的了,因为 build/3d-tags.js 原来的内容已经没有了,而且 cat 还没有启动.

然后,当 cat 启动时,它会打开其参数中指定的文件。打开它们的时间和顺序并不是非常重要。当然,这会打开它们以供阅读。然后它从 src/license.txt 读取并写入其标准输出。这篇文章位于build/3d-tags.js。此时,它是该文件中唯一内容,因为它之前已被截断。

cat 然后从 build/3d-tags.js 读取。它找到刚刚写入的内容,这是 cat 之前从 src/license.txt 中读取的内容。它将内容写入文件末尾。然后它返回并尝试阅读更多内容。当然,它会找到更多内容来读取,因为它只是将更多数据写入文件末尾。它读取剩余的数据并将其写入文件。等等。

为了让 cat 按您希望的方式工作(甚至忽略 shell 重定向,从而删除 build/3d-tags.js 的内容),它必须读取并将build/3d-tags.js的全部内容保留在内存中,无论它有多大,以便在写入src/license.txt的内容后可以写入它.

实现您想要的目标的最佳方法可能是这样的:

cat src/license.txt build/3d-tags.js > build/3d-tags.js.new && mv build/3d-tags.js.new build/3d-tags.js || rm -f build/3d-tags.js.new

即:将两个文件连接成一个新文件;如果成功,将新文件移动到原始文件名(替换原始文件);如果任一步骤失败,请删除临时"new"文件,以免留下垃圾。

关于macos - 从 Unix cat 将文件重定向到自身时出现无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111113/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com