问题
在 bash 中,您可以通过管道数据逐步传递数据:
program1 | program2 | program3 | ...
或者您可以使用变量来执行此操作(取决于每个程序的工作方式):
RES1=$(program1)
RES2=$(program2 $RES1)
...
我正在寻找这种并行传递数据的对应物。
例子
我尝试将我的“线性”脚本转换为令人惊叹的并行脚本(这个工具仍然为我创造奇迹:-D),但我在阅读和使用第一步的输出时遇到问题。原始版本:
for fn in $(ls $REV *)
do
DATA=$(sh script1.sh ${fn})
sh script2.sh $DATA
done
这是我尝试使用以下方法执行此操作的方法parallel
:
ls $REV * | parallel -j+0 DATA=$(sh script1.sh {}) \; sh script2.sh $DATA
然而,使用此代码myscript
会在输入时得到一些损坏的数据。删除了读取结果和第二步的版本可以正常工作:
ls $REV * | parallel -j+0 sh script1.sh {}
那么如何读取第一步的输出parallel
并在下一步中使用它呢?
问题
为了更轻松地调试,假设我的第一个脚本 (script1.sh) 是:
echo "RECEIVED THIS ${1}"
主要脚本是:
ls * | parallel -j+0 RES="$(sh script1.sh {})"
(我在这里跳过了 script2 以测试捕获 script1 的输出)。那么整个执行的结果是这样的:
/bin/bash: THIS: command not found
/bin/bash: THIS: command not found
/bin/bash: THIS: command not found
...