如何从子shell中获取变量,同时也使用xargs传递参数?

时间:2017-07-27 13:20:14

标签: bash

我想将文件名传递给xargs并在子shell中处理它,然后从subshel​​l获取特定变量到当前shell。我更喜欢xargs用于并行化目的。

以下是示例代码:

files_with_issues=()
printf "%s\n" ${list_of_file_names[@]} | xargs -n1 -P4 -I {file} bash -c '
        # Process the file ...
        exit_status=$?
        [ ${exit_status} -ne 0 ] && files_with_issues+=({file})'

echo "${files_with_issues[@]}"

我正在考虑使用类似source.的内容来获取子shell中的变量。但是我无法弄清楚如何实现这个目标?

2 个答案:

答案 0 :(得分:1)

回答新问题

如果您需要对每个文件执行复杂的操作,您希望将其作为标准输入或参数传递给脚本。然后,该脚本可以输出NUL分隔的文件名,然后您可以在数组中捕获它们:

while IFS= read -r -d '' -u 9 file
do
    files_with_issues+=("$file")
done 9< <(./process_files.sh <<< "${list_of_file_names[@]}")

回答原始问题

由于

$ echo foo | xargs -I {file} bash -c 'echo "Information about {file}"'
Information about foo

你可以做到

$ info="$(echo foo | xargs -I {file} bash -c 'echo "Information about {file}"')"

答案 1 :(得分:0)

似乎唯一的办法就是将variable写入文件,然后从主shell中捕获它。以下是我处理它的方法:

capture="capture.log"
text_to_capture="file_with_an_issue: "
[ -e ${capture} ] && rm ${capture}     #(1)
printf "%s\n" ${list_of_file_names[@]} | xargs -n1 -P4 -I {file} bash -c '
    # Process the file ...
    exit_status=$?
    [ ${exit_status} -ne 0 ] && echo "${text_to_capture}{file}" >> ${capture}'     #(2)

files_with_issues=$(grep -oP "(?<=${text_to_capture}).*" ${capture})     #(3)

有些说明:

1)[ -e ${capture} ] && rm ${capture}

在附加任何文字之前,请确保该文件不存在。

2)echo "${text_to_capture}{file}" >> ${capture}

通过text将某些variable>>附加到该文件并列出所有内容。

3)grep -oP "(?<=text_to_capture).*" ${capture}

variablegrep

的帮助下从文件中抓取regex