使用 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 中,当派生进程尝试从标准输入读取时,结果未指定。)
我有以下两个脚本:
#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 中,当派生进程尝试从标准输入读取时,结果未指定。)