![如果 w 命令或标志从未执行过,是否允许 sed 创建文件?](https://linux22.com/image/209474/%E5%A6%82%E6%9E%9C%20w%20%E5%91%BD%E4%BB%A4%E6%88%96%E6%A0%87%E5%BF%97%E4%BB%8E%E6%9C%AA%E6%89%A7%E8%A1%8C%E8%BF%87%EF%BC%8C%E6%98%AF%E5%90%A6%E5%85%81%E8%AE%B8%20sed%20%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我刚刚发现如果我执行
echo foo|sed 's/x/u/w/tmp/bar'
使用 GNU 时sed
,会创建一个空文件/tmp/bar
,这不是有意的,因为该w
标志不适用。更糟糕,
echo foo|sed 'd;w/tmp/bar'
还创建了那个空文件!呜呜。
确实,GNUsed
手册承认:
该文件将在读取第一个输入行之前创建(或截断)
我想,如果您不必测试每个文件句柄是否打开,那么实现起来会更容易,但是 的 POSIX 定义并sed
没有说可以在不执行命令的情况下触摸该文件。--posix
GNU 的切换没有sed
帮助。
sed
您知道这种情况下其他实现的行为吗?
或者我误解了这里的标准?
答案1
sed
关于命令处理w
和命令w
标志的GNU 实现严格遵循 POSIX 规范s
。以下内容来自sed
实用程序的 POSIX 规范的扩展描述部分:
每个工作文件应在处理开始之前创建。
w
“wfile”是由命令或命令w
的标志写入的文件s
。
在 FreeBSD、macOS、OpenBSD 和 NetBSD 上发现的BSD 实现sed
有一个非标准-a
选项,可以延迟“wfile”的创建或截断,直到将其写入:
-a
w
默认情况下, 作为函数参数列出的文件是在任何处理开始之前创建(或截断)的。该-a
选项会导致sed
延迟打开每个文件,直到将包含相关函数的命令w
应用于输入行。