问题标签 [process-substitution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
141 浏览

bash - 流程替换的惯用用法

我从 Bash 的手册页中学习了 Bash 进程替换。不幸的是,我对该功能的不熟练使用是丑陋的。

熟练的程序员还有其他方法可以做到这一点吗?

如果需要可执行示例,请尝试以下操作:

样本输出:

在我的实际应用中,“一些命令”比较复杂,但上面的示例抓住了问题的本质。

需要进程替换<()。流程替代的替代方案无济于事。

0 投票
1 回答
184 浏览

bash - cat、echo 和进程替换

基本上我想了解这些命令之间的区别:

还有那些命令:

前两个命令的结果完全相同:打印“yolo”,然后终端返回控制权,这正是我所期望的。

[user@localhost ~]$ cat <<< yolo | 三通 f.txt

约洛

[user@localhost ~]$ echo yolo | 三通.txt

约洛

但是使用进程替换,会发生一些奇怪的事情echo

[user@localhost ~]$ cat <<< yolo >>(tee f.txt)

约洛

[user@localhost ~]$ echo yolo > >(tee t.txt)

[user@localhost ~]$ yolo

在打印出文本之前,终端会返回控制权。在这种情况下,为什么我能更快地获得控制权?

这一定与如何打开进程以及如何在进程之间传递文件描述符有关,但我有点达到了我的知识极限。

如果我将它通过管道传输到其他任何东西,一切都会恢复正常,例如echo yolo > >(tee t.txt) | cat.

更奇怪的是 xargs'ing intoecho效果很好:

[user@localhost ~]$ xargs echo <<< yolo >>(tee t.txt)

约洛

但你可以说这xargs是这里的主程序,而不是echo.

如果我使用输入过程替换,cat我会得到不同的结果:

cat < <(echo yolo) > >(tee t.txt)

有时它给了我这个:

[user@localhost ~]$ cat <<(echo yolo) > >(tee t.txt)

[user@localhost ~]$ yolo

有时是这样的:

[user@localhost ~]$ cat <<(echo yolo) > >(tee t.txt)

约洛

所以我想这可能与系统执行命令的速度有关,这使得它变得不可预测。

这是否意味着输出进程替换(例如tee在本例中)在后台运行?

0 投票
1 回答
69 浏览

bash - 将进程替换与此处的字符串相结合

我正在尝试将命令的结果和此处的字符串结合起来,如下所示:

我得到这个输出:

代替

为什么?

0 投票
1 回答
61 浏览

c++ - 为什么在这里使用进程替换会导致挂起?

我有一个程序需要启动其他程序,可能用文件和管道替换它们的标准输入输出。虽然它似乎“工作”,因为子进程确实从源管道获取它的 I/O,但不幸的是,它也会导致挂起。子进程似乎永远不会得到EOF.

这是代码的最小复制,为什么打印后会挂起"Hello World\n"

0 投票
2 回答
967 浏览

bash - Shell 从带有尾部的文件中读取

我目前正在尝试使用 shell 从文件中读取。但是,我遇到了一个语法问题。我的代码如下:

但是,它返回我错误syntax error near unexpected token('`

我尝试使用 tail -n遵循How to use while read line但仍然看不到错误。

tail 命令正常工作。

任何帮助都将得到批准。

0 投票
0 回答
58 浏览

named-pipes - Bash 进程替换的行为与命名管道不同?

有点跟进这个问题。我使用 bash 进程替换期望看到 5 行输出(对应于 5s 超时)但是我只看到 4 行:

但是,如果我在中间放置一个命名管道,我会按预期得到 5 行。第一个外壳:

第二个外壳:

第一个 shell 的输出(5 行):

为什么我在使用 bash 进程替换时没有得到 5 行?

奖金

我还尝试将输出转储到文件而不是但这给了我一个空的日志文件:

我发现在使用时,我的rates.log文件包含最初预期的多行输出:

需要 stdbuf ?(另请注意该文件包含 4 行,因此此调用结构可能会遇到与上述相同的问题)

0 投票
1 回答
86 浏览

bash - 用作选项值的 Bash 进程替换

我正在尝试运行

docker-compose预计--env-file是一个文件。我需要使用(连接)两个文件。

跑步docker-compose --env-file file_any.env config效果很好。

单独运行cat file1.env <(echo -e "\n\n") file2.env输出有效结果。

但它不知何故不适用于docker-compose.

我究竟做错了什么?

0 投票
1 回答
2422 浏览

bash - @<(cat <<- EOF 在 Bash 中做了什么?

我在 Bash 脚本中偶然发现了一些奇怪的 heredoc 用法。一个简化的例子是这样的:

零件有什么@<(cat <<- EOF作用?它与普通的heredoc有什么不同?

0 投票
0 回答
23 浏览

bash - 进程替换不适用于 install-sh autoconfigure

我有一个问题, <() 不适用于自动配置中的 install-sh 它给了我这个错误

虽然这工作正常

0 投票
2 回答
152 浏览

bash - SIGPIPE 由于文件描述符和进程替换

我正在尝试从执行工具的 bash 函数中保存一些日志(其中一些在子 shell 中运行)。此外,我想将所有错误打印到终端。

我的代码在点击 ctr-c 和一个奇怪的日志文件时会导致一个 sigpipe 和退出代码 141。管道失败似乎是由陷阱内的 stdout 重定向到 stderr 引起的,这会破坏 tee 命令的 stdout 流。有趣的是,代码按预期终止,退出代码 130 没有在陷阱或cat命令中使用重定向。

  1. 我仍然无法修复和解释生成的日志文件。为什么有两次回声,为什么陷阱回声也写入文件?

  2. 为什么函数内的重定向不是更早引起的信号管道?

日志文件

编辑:根据oguz ismail回答的工作示例