我正在使用 Cygwin -不,还没有关闭- 我在<()
语法上遇到了问题。程序拒绝接受我传递的文件描述符,但其他程序会很好地接受它。我的假设是程序将文件描述符传递给它的帮助程序之一,然后该程序不会接收管道(只是通常的0
、1
和2
,其中0
和2
可能已关闭)。这适用于cat
,但不适用于该程序。
MCVE:
./jpegtran -copy all -drop +16+16 <(echo "JPEG FILE") -outfile out.jpeg out.jpeg
这会产生错误消息:
C:\path\to\jpegtran.exe: can't open /dev/fd/63 for reading
有没有办法做到这一点?或者我必须诉诸...临时文件?*不寒而栗*
据我所知,Cygwin 出于所有意图和目的模拟了 POSIX 环境。如果它无法使用命名管道创建伪文件(我知道可以使用 下的 Windows API ,当我向 Windows 程序传递路径//./pipe/pipename
时,应该能够使用当前使用的任何名称重写来处理它/cygdrive/c/
)然后我对适用于实际“nix 盒子”的答案感到满意。
答案1
注意:经过多次反复讨论,确定 OP 使用的是jpegtran
支持“裁剪和放置”(将一张图像的一部分复制到另一张图像中)的非标准版本。
那么为什么进程替换(又名 PS)不能使用此功能呢?如果不看代码,我们不能绝对、100% 自信地说,但有一个很有可能的解释。 PS 创建一个特殊文件,它实际上是一个只读管道,可以通过流方式访问数据。使用它时,您当然不能写入文件,更重要的是,你无法在其中寻找(随机访问)。尝试将 PS 与任何您能想到的不使用流模型的工具一起使用(vim 就是一个例子)。你要么能做的事情受到限制,要么根本不起作用。
鉴于此功能jpegtran
正在提取源图像 (JPEG) 的矩形子集,因此实现该功能的人似乎不太可能对自己施加限制以限制对单向流的访问。拉出图像的一部分显然是一种搜索操作,如果不是强制性的,也是非常有用的。因此,PS 是不允许的。