使用 xargs 将数组作为命令行参数传递

Passing arrays as command line arguments with xargs

我有以下两个脚本:

#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,而不是简单的管道传递?原因是我将不得不处理大数组和长参数列表,这将成为管道问题。

编辑: 根据答案和评论,这是正确的做法:

#script1.sh
#!/bin/bash
this_chunk=(1 2 3 4)
printf "%s[=13=]" "${this_chunk[@]}" | xargs -0 ./script2.sh


#script2.sh
#!/bin/bash
for i in "${@}"; do
    echo $i
done

how to pass the array this_chunk using xargs

请注意,xargs 默认解释 ' "\ 序列。要禁用解释,要么预处理数据,要么更好地使用带有 -d '\n' 选项的 GNU xargs。 -d 选项不是 POSIX xargs.

的一部分
printf "%s\n" "${this_chunk[@]}" | xargs -d '\n' ./script2.sh

也就是说,GNU xargs 更喜欢零终止流,以保留换行符:

printf "%s[=11=]" "${this_chunk[@]}" | xargs -0 ./script2.sh

您的脚本 ./script2.sh 忽略命令行参数,并且您的 xargs 生成进程并关闭标准输入。由于输入已关闭,read -r arr 失败,因此您的脚本不会按预期打印任何内容。 (请注意,在 POSIX xargs 中,当派生进程尝试从标准输入读取时,结果未指定。)