zsh 捕获并将输出通过管道传输到另一个命令

zsh 捕获并将输出通过管道传输到另一个命令

我有 zsh 脚本

printf '%s\0' www/scripts6/lib/* | xargs -0 -I{} -P 50 babel {} > {}

它起作用了(我认为)。但我需要实际将文件复制到scripts目录而不是scripts6.另外,我需要手动向路径列表添加额外的路径,所以我尝试这样做:

paths=$(printf '%s\0' www/scripts6/lib/* | sed -e 's@www/scripts6/@@g')
paths=$paths'main.js'$'\0'
echo -n $paths | xargs -0 -I {} -P 50 babel www/scripts6/{} > www/scripts/{}

这对我来说是一个巨大的成就。不管怎样,脚本会创建目录{}中指定的文件scripts(目录中没有任何内容scripts/lib)。这让我相信只有{}代码中的第一个被参数替换,而不是第二个(并且我没有解释目录中缺少文件scripts/lib)。

我怎样才能使脚本按预期工作?

答案1

重定向发生在xargs执行之前。因此,您的第一个示例还创建了一个名为 的文件{},因为xargs从未有机会替换最后一个{}.

另外,虽然您确实尝试用空值分隔文件名以“正确”处理文件名,但一旦您使用echo. echoinzsh默认解释 C 风格的转义符(\t、\n 等)。您需要 -E 选项来禁用它。

尝试一下,看看它是否符合您的要求

setopt monitor
for f in www/scripts6/lib/*(e*'REPLY=${REPLY#www/scripts6/}'*) main.js; do;
  while (( $#jobstates >= 51 )); do 
    sleep 1
  done
  echo -E babel $f \> www/scripts/$f &
done

如果输出看起来没问题,请删除 echo -E 并将 \> 替换为 >

相关内容