Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用xargs将stdin分配给变量_Bash_Pipe_Xargs - Fatal编程技术网

Bash 使用xargs将stdin分配给变量

Bash 使用xargs将stdin分配给变量,bash,pipe,xargs,Bash,Pipe,Xargs,我真正想做的就是确保管道中的所有操作都成功,并将最后一个stdin分配给一个变量。考虑下面的虚拟场景: x=`exit 1 | cat` 当我运行declare-a时,我看到: declare-a PIPESTATUS='([0]=“0”)' 我需要一些方法来注意退出1,因此我将其转换为: 退出1 | cat | xargs-I{}x={} 和declare-a给了我: declare-a PIPESTATUS='([0]=“1”[1]=“0”[2]=“0”)” 这就是我想要的,所以我试着看看如

我真正想做的就是确保管道中的所有操作都成功,并将最后一个stdin分配给一个变量。考虑下面的虚拟场景:

x=`exit 1 | cat`

当我运行
declare-a
时,我看到:

declare-a PIPESTATUS='([0]=“0”)'

我需要一些方法来注意
退出1
,因此我将其转换为:

退出1 | cat | xargs-I{}x={}

declare-a
给了我:

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

这就是我想要的,所以我试着看看如果退出1失败会发生什么:

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

但它在以下方面失败了:

xargs:x={}:没有这样的文件或目录

有没有办法让xargs将
{}
分配给
x
?让
PIPESTATUS
工作并将stdin分配给变量的其他方法如何


注意:这些示例已简化。我并不是真的在做
exit 1
echo 1
cat
,而是使用这些命令来简化,以便我们可以关注我的特定问题。

xargs
在子进程中运行,就像您调用的所有命令一样。所以它们不会影响外壳的环境

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

编辑:

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

command1 | command2 | command3 >/tmp/tmpfile
## Examine PIPESTATUS
X=$(cat /tmp/tmpfile)
当您使用backticks(或首选的
$()
)时,您正在子shell中运行这些命令。您获得的
PIPESTATUS
用于分配,而不是子shell中的管道命令

使用
xargs
时,它对shell一无所知,因此无法进行变量赋值

尝试
设置-o pipefail
然后您可以从
$?

获取状态,那么

read x <<<"$(echo 1)"
read x < <(echo 1)

echo "$x"

读取x为什么不填充一个新数组

IFS=$'\n' read -r -d '' -a result < <(echo a | cat | cat; echo "PIPESTATUS='${PIPESTATUS[*]}'" )
IFS=$'\n' read -r -d '' -a result < <(echo a | exit 1 | cat; echo "PIPESTATUS='${PIPESTATUS[*]}'" )

echo "${#result[@]}"
echo "${result[@]}"
echo "${result[0]}"
echo "${result[1]}"

IFS=$'\n'read-r-d'-结果<已经有一些有用的解决方案。事实证明,我有一个例子,与上面的问题相匹配;反正已经够近了

考虑这一点:

 XX=$(ls -l *.cpp | wc -l  | xargs -I{} echo {})
 echo $XX
 3
这意味着我的工作目录中有3个x
.cpp
文件。现在,
$XX
是3,我可以在脚本中使用这个结果。这是人为的,因为在本例中我实际上不需要
xargs
。但它确实有效

在问题的例子中

x=`exit 1|cat`
我不认为这会给你指定的东西
exit
将在提到
cat
之前退出子shell。也在这一点上

我可以从这样的事情开始

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

x
现在具有上一个命令的状态

将每行输入分配给一个数组,例如目录中的所有python文件

declare -a pyFiles=($(ls -l *.py | awk '{print $9}')) 

其中$9是ls-l中与文件名相对应的第九个字段

我认为read可以做类似的事情。echo 1读取x无效。你有一个例子吗?有趣的想法。使用(退出1)CAT仍然没有正确填充PyPATSUS。PIPPELT是一个很好的选择。然而,我希望我能得到管道中所有东西的管道状态。