为什么在Cygwin中使用tee命令会出现Not a directory告警?
告警根因
你遇到的报错是Cygwin平台对bash进程替换语法的实现兼容问题导致的:
- 你代码里的
>(tee)是bash的进程替换特性:bash会创建一个匿名管道,将管道的写入端以/dev/fd/[数字]的路径形式作为参数传递给前面的tee命令,tee往这个路径写入的内容会直接喂给括号内的tee进程处理。 - Linux环境下
/dev/fd/[数字]属于标准的字符设备路径,coreutils包的tee命令可以正常识别写入,不会有额外报错。 - Cygwin的POSIX模拟层实现存在差异:coreutils的
tee命令拿到/dev/fd/63这类路径时,会额外触发路径合法性检查,错误地尝试将该路径当做普通文件路径校验父目录是否存在,最终抛出Not a directory的非致命告警。
因为这个告警仅出现在路径检查阶段,不会实际影响内容写入对应的文件描述符,所以你的命令功能完全正常,只是多了一条无关的错误输出。
可选消告警方案
如果不想看到这条告警,可以在命令中过滤该类错误输出:
echo "hi" | tee >(tee) 2> >(grep -v 'tee: /dev/fd/.*: Not a directory' >&2)
内容的提问来源于stack exchange,提问作者zomega
相关产品推荐
相关产品推荐

