使用 xargs 将 stdin 分配给变量

Use*_*er1 5 bash pipe xargs

我真正想做的就是确保管道中的所有内容都成功并将最后一个标准输入分配给变量。考虑以下简化的场景:

x=`exit 1|cat`

当我跑步时declare -a,我看到这个:

declare -a PIPESTATUS='([0]="0")'

我需要某种方法来注意到exit 1,所以我将其转换为:

exit 1|cat|xargs -I {} x={}

declare -a给了我:

declare -a PIPESTATUS='([0]="1" [1]="0" [2]="0")'

这就是我想要的,所以我尝试看看如果exit 1没有发生会发生什么:

echo 1|cat|xargs -I {} x={}

但它失败了:

xargs: x={}: No such file or directory

有没有办法让 xargs 分配{}xPIPESTATUS其他工作并将标准输入分配给变量的方法怎么样?

注意:这些例子是简化的。我并没有真正执行exit 1echo 1a cat,而是使用这些命令进行简化,以便我们可以专注于我的特定问题。

Dou*_*der 3

xargs与您调用的所有命令一样在子进程中运行。所以它们不会影响你的 shell 的环境。

您也许可以使用命名管道 ( mkfifo) 或 bash 的read函数来执行某些操作?

编辑:

也许只是将输出重定向到文件,然后您可以使用 PIPESTATUS:

command1 | command2 | command3 >/tmp/tmpfile
## Examine PIPESTATUS
X=$(cat /tmp/tmpfile)
Run Code Online (Sandbox Code Playgroud)