【发布时间】:2021-11-14 14:03:29
【问题描述】:
我有以下两个脚本:
#script1.sh:
#!/bin/bash
this_chunk=(1 2 3 4)
printf "%s\n" "${this_chunk[@]}" | ./script2.sh
#script2.sh:
#!/bin/bash
while read -r arr
do
echo "--$arr"
done
当我执行script1.sh时,输出如预期:
--1
--2
--3
--4
这表明我能够将数组this_chunk 的元素作为参数传递给script2.sh。但是,如果我将调用script2.sh 的行更改为
printf "%s\n" "${this_chunk[@]}" | xargs ./script2.sh
没有输出。我的问题是,如何使用xargs 传递数组this_chunk,而不是简单的管道?原因是我将不得不处理大型数组和长参数列表,这将成为管道问题。
编辑: 根据答案和 cmets,这是正确的方法:
#script1.sh
#!/bin/bash
this_chunk=(1 2 3 4)
printf "%s\0" "${this_chunk[@]}" | xargs -0 ./script2.sh
#script2.sh
#!/bin/bash
for i in "${@}"; do
echo $i
done
【问题讨论】:
-
您似乎误解了
xargs的作用。您的脚本忽略了参数。hus long argument lists which will be a problem with piping.?为什么会有问题?您绝对可以通过管道传递更多信息,然后通过命令行参数传递。 -
xargs按预期工作,但 script2.sh 忽略其参数。尝试在 script2.sh 开头添加echo "Received $# arguments:" "$@"以查看它们。 -
@Botond:您不会将任何数组管道到另一个进程中。你调用一个命令 (
printf) 通过使 shell 将单个数组元素作为参数传递给这个命令;这个命令在标准输出上产生一些文本流,然后这个流被传送到下一个进程。接收进程永远不会看到数组,因为标准输入是无类型的字符流;标准输入法中没有“数组”的概念。