Questions tagged «process-substitution»

进程替换是一种进程间通信的形式,它允许命令的输入或输出显示为文件(例如:“ <(cmd)”或“>(cmd)”)。

5
工艺替代和管道
我想知道如何理解以下内容: 将命令的标准输出插入另一个命令的标准输入是一项强大的技术。但是,如果您需要传递多个命令的标准输出怎么办?这是过程替代的地方。 换句话说,过程替换可以执行管道的任何操作吗? 进程替换可以做什么,而管道不能做什么?

2
为什么进程替换会导致一个名为/ dev / fd / 63的文件,这是一个管道?
我试图在此特定示例的上下文中了解命名管道。 我输入&lt;(ls -l)我的终端,并输出为bash: /dev/fd/63: Permission denied。 如果输入cat &lt;(ls -l),我可以看到目录内容。如果我更换cat用echo,我觉得我得到的终端名称(或者是什么呢?)。 echo &lt;(ls -l)将输出给出为/dev/fd/63。 另外,这个示例输出对我来说还不清楚。 ls -l &lt;(echo "Whatever") lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -&gt; pipe:[48078752] 但是,如果我给出,ls -l &lt;()它将列出目录内容。 如果命名管道发生了什么情况?

2
为什么`sort <(ls -l)`起作用而`sort <(ls -l)`失效?
今天,我通过这篇文章学习了关于fifo的知识:提到了命名管道cat &lt;(ls -l)。 我使用进行了一些实验sort &lt; (ls -l),弹出一个错误: -bash: syntax error near unexpected token `('` 然后我发现我在命令中添加了多余的空间。 但是,为什么这个额外的命令会导致此失败呢?为什么重定向符号必须靠近(?

1
为什么某些命令无法使用BASH进程替换?
有时,流程替换将无法按预期进行。这是一个例子: 输入: gcc &lt;(echo 'int main(){return 0;}') 输出: /dev/fd/63: file not recognized: Illegal seek collect2: error: ld returned 1 exit status 输入: 但是,当与其他命令一起使用时,它可以按预期工作: grep main &lt;(echo 'int main(){return 0;}') 输出: int main(){return 0;} 我注意到其他命令也发生了类似的故障(即,期望来自进程替换的文件的命令无法使用/dev/fd/63或类似)。这次故障gcc只是最近一次。我是否应该确定一些通用规则来确定何时进程替换将以这种方式失败并且不应该使用? 我正在Ubuntu 12.04上使用此BASH版本(我也在arch和debian中也看到过): GNU bash,版本4.3.11(1)-release(i686-pc-linux-gnu)

2
什么是实现流程替代的可移植(POSIX)方法?
一些shell(例如bash)支持Process Substitution,这是一种将过程输出显示为文件的方式,如下所示: $ diff &lt;(sort file1) &lt;(sort file2) 但是,此构造不是POSIX,因此不可移植。如何处理替代的实现POSIX -友好的方式(即其中一个在工作/bin/sh)? 注意:问题不是问如何区分两个排序的文件-这只是一个演示流程替换的人为例子!

4
bash:如何在流程替换中传播错误?
我希望我的Shell脚本每执行一个命令失败就会失败。 通常,我这样做的方法是: set -e set -o pipefail (通常我set -u也添加) 关键是上述方法都不能用于流程替换。这段代码显示“ ok”,并以返回代码= 0退出,但我希望它失败: #!/bin/bash -e set -o pipefail cat &lt;(false) &lt;(echo ok) 除了流程替代之外,还有什么等同于“ pipefail”的东西?还有其他方法可以将命令的输出作为文件传递给命令,但是每当这些程序出现故障时都会引发错误? 穷人的解决方案是检测那些命令是否写入stderr(但在成功的情况下某些命令写入stderr)。 另一个与posix兼容的解决方案将使用命名管道,但是我需要放宽这些命令的使用过程,因为oneliners是由编译后的代码动态构建的,而创建命名管道会使事情复杂化(额外的命令,捕获错误,删除它们,等等)

1
在zsh中,cat <(cat)与cat |之间的区别 猫vs猫=(猫)?
我期望cat &lt;(cat)并cat | cat做同样的事情:将行从stdin复制到stdout。我的理解是,两者都将cat在子shell中执行一个,将子shell cat的stdout 重定向到一个临时的命名管道,然后cat在当前shell中执行另一个,将其stdin重定向到该管道。 取而代之的是cat &lt;(cat)让我在终端上键入内容,但是没有任何输入行被复制并且^D无法发出信号EOF;cat | cat工作正常。 作为进一步的实验,我检查了是否cat =(cat)有与相似的困难cat &lt;(cat),但是它按我的预期工作:一次将所有stdin直到一个^Dget都复制到stdout。 谁能帮助我了解zsh的功能?

4
如何在Dash中模拟流程替代?
在中bash,我可以使用Process Substitution并将进程的输出视为已保存在磁盘上的文件: $ echo &lt;(ls) /dev/fd/63 $ ls -lAhF &lt;(ls) lr-x------ 1 root root 64 Sep 17 12:55 /dev/fd/63 -&gt; pipe:[1652825] 不幸的是,中不支持Process Substitution dash。 Process Substitution用破折号模拟的最佳方法是什么? 我不想将输出另存为临时文件(/tmp/),然后将其删除。还有其他方法吗?

2
流程替代输出不正常
的 echo one; echo two &gt; &gt;(cat); echo three; 命令给出了意外的输出。 我读到以下内容:如何在bash中实现流程替换?以及许多其他有关Internet上的流程替换的文章,但不明白为什么它会以这种方式运行。 预期产量: one two three 实际输出: prompt$ echo one; echo two &gt; &gt;(cat); echo three; one three prompt$ two 另外,从我的角度来看,这两个命令应该等效,但它们不相同: ##### first command - the pipe is used. prompt$ seq 1 5 | cat 1 2 3 4 5 ##### …

5
列表中的grep文件
我正在尝试对几百个文件的列表运行grep: $ head -n 3 &lt;(cat files.txt) admin.php ajax/accept.php ajax/add_note.php 但是,即使我在文件中找到我知道的字符串时,它们也不会搜索文件: $ grep -i 'foo' &lt;(cat files.txt) $ grep -i 'foo' admin.php The foo was found 我对从文件-f读取模式的标志很熟悉。但是如何读取输入文件? 我曾考虑过将文件复制到cp似乎支持该&lt;(cat files.txt)格式的临时目录的可怕方法,然后从那里复制文件。雪莉有更好的方法。

3
如何将Bash的流程替换与HERE文档结合在一起?
在Bash 4.2.47(1)-发行版中,当我尝试对来自HERE-dcoument的格式化文本进行分类时,如下所示: cat &lt;(fmt --width=10 &lt;&lt;FOOBAR (I want the surrounding parentheses to be part of the HERE-document) (Even the preceding unbalanced parenthesis should be part of it. FOOBAR ) # I want this paranthesis to end the process substitution. 我收到以下错误: bash: bad substitution: no closing `)' in &lt;(fmt --width=10 &lt;&lt;FOOBAR …

2
Bash:进程替换和标准输入
以下行很明显: echo "bla" | foo | bar 但是下面的那些也一样吗? echo "bla" | bar &lt;(foo) echo "bla" | bar &lt; &lt;(foo) 其中foo,并bar从标准,为什么读“喇嘛”? 我的意思是,我当然可以对其进行编码和检查,但是我不确定它是否是已定义的行为,或者我是否在利用我不应该依赖的功能。

4
使用流程替换时,如何捕获退出代码/正确处理错误?
我有一个脚本,该脚本使用从SO上的Q&A采取的以下方法将文件名解析为数组: unset ARGS ARGID="1" while IFS= read -r -d $'\0' FILE; do ARGS[ARGID++]="$FILE" done &lt; &lt;(find "$@" -type f -name '*.txt' -print0) 这很好用,可以完美处理所有类型的文件名变体。但是,有时,我会将不存在的文件传递给脚本,例如: $ findscript.sh existingfolder nonexistingfolder find: `nonexistingfile': No such file or directory ... 通常情况下,我会让脚本RET=$?使用类似的代码捕获退出代码,然后使用它来决定如何继续。这似乎不适用于上面的流程替换。 在这种情况下正确的程序是什么?如何捕获返回码?还有其他更合适的方法来确定替换过程中是否出了问题吗?

3
我如何使用tee重定向到grep
我没有使用tee的丰富经验,所以我希望这不是很基本。 查看此问题的答案之一后,我遇到了一个奇怪的行为tee。 为了输出第一行和找到的行,我可以使用以下命令: ps aux | tee &gt;(head -n1) | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND syslog 806 0.0 0.0 34600 824 ? Sl Sep07 0:00 rsyslogd -c4 但是,我第一次运行此命令(在zsh中)时,结果顺序错误,列标题位于grep结果的下方(但是,此操作不再发生),因此我尝试在以下位置交换命令: ps aux | tee &gt;(grep syslog) | head -n1 USER PID %CPU %MEM VSZ …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.