Bash 使用xargs将stdin分配给变量
我真正想做的就是确保管道中的所有操作都成功,并将最后一个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”)” 这就是我想要的,所以我试着看看如
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是一个很好的选择。然而,我希望我能得到管道中所有东西的管道状态。