如何使用 bash 将子进程传递给命令

如何使用 bash 将子进程传递给命令

我正在尝试使用子进程将多个输出传递给命令。这是我的命令(的缩写版本):

cat "$1"
one=cat "$1"

的输出command <(echo "foo")

foo
/dev/fd/63: Permission denied

由于cat "$1"有效,我假设该函数有权读取子流程的输出,但当我尝试将其放入变量时,权限被拒绝。为什么会这样,有什么办法可以解决吗?

答案1

你的问题并不完全清楚。但我猜你有一个名为的命令x,它的作用如下:

cat "$1"
one=$(cat "$1")

现在,当你这样做时,x <(echo "foo")你会得到一个错误。

这是因为<(...)结构的工作原理。

基本上它运行echo foo并将其输出连接到临时文件句柄(/dev/fd/63),然后将其作为参数传递。

所以现在你的第一个cat命令读取整个输入。这意味着没有剩余的输入。所以你的第二 cat命令没有任何可读取的内容。您会收到错误,因为该echo过程已完成并且没有打开的句柄可供读取。

以简单的形式,您已经完成了一个特殊版本

echo "foo" | {
  cat
  one=$(cat)
}

但具有巧妙的文件处理魔法。

相关内容