Bash 为什么二进制进程替换不';不行? feh

Bash 为什么二进制进程替换不';不行? feh,bash,redirect,Bash,Redirect,您的操作是正确的,但是feh有一个错误/功能使它失败 如果你看一下,你可以看到这是怎么发生的。在排除了大量细节的伪代码中,如下所示: feh <(cat img.jpg); 这是一个递归查找文件的简单函数,它还处理URL和-,特别是当直接在命令行上指定时(而不是当它们显示为文件名时) 在递归过程中,它将添加常规文件,并下降到目录中。其他任何内容都将被跳过。这大概是因为尝试读取套接字、设备和FIFO很少有意义。但是,作为一个副作用,它也会忽略您的/dev/fd/63,因为它是一个fifo

您的操作是正确的,但是
feh
有一个错误/功能使它失败

如果你看一下,你可以看到这是怎么发生的。在排除了大量细节的伪代码中,如下所示:

feh <(cat img.jpg);
这是一个递归查找文件的简单函数,它还处理URL和
-
,特别是当直接在命令行上指定时(而不是当它们显示为文件名时)

在递归过程中,它将添加常规文件,并下降到目录中。其他任何内容都将被跳过。这大概是因为尝试读取套接字、设备和FIFO很少有意义。但是,作为一个副作用,它也会忽略您的
/dev/fd/63
,因为它是一个fifo


有人可能会说,
feh
应该尝试读取用户明确指定的任何内容,这将是一个简单的解决方案。然而,事实上,没有办法让它直接与Bash的进程替换一起工作。

但是
mpv复制了
feh img.jpg
??你为什么要在这里进行任何类型的替换?@DavidC.Rankin,以防出现
feh,这就是原因。如果没有这个例子,您试图实现的目标有点令人困惑。不仅是feh,而且eog和gimp都不起作用。这是否意味着它们都共享相同的文件读取算法?由于进程替换的工作方式,很容易破坏支持。有些程序在启动时关闭所有未知的FD(如63),有些是客户机/服务器或单个实例,其中可执行文件只是中继命令,而不是打开FD,有些程序尝试打开两次文件或回放FIFO不支持的文件。您必须查看每个单独的程序,以了解其失败的具体原因。
void add_file_to_filelist_recursively(path, is_first_level) {
  if (is_first_level) {
    if(path_is_url(path)) {
      // Download
    } else if(path == "-") {
      // Read STDIN
    }
  }

  if(is_directory(path)) {
    for(file in path) {
      add_file_to_filelist_recursively(file, false);
    }
  } else if(is_regular_file(path)) {
    add(path);
  }
}