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)。これにより、コード内の最初の項目だけが引数に置き換えられ、2番目の項目は置き換えられないと考えられます{}(そしてディレクトリから見つからないファイルを説明しませんscripts/lib)。

スクリプトが期待どおりに機能するようにするにはどうすればよいですか?

答え1

xargs実行前にリダイレクトが発生します。したがって、最初の例では、最後のファイルを置き換える機会がない{}ため、というファイルも生成されます。xargs{}

また、ファイル名をnullで区切って「適切に」処理しようとしている間に、Cスタイルエスケープ(\ t、\ nなど)を使用すると、デフォルトで解釈されますecho。無効にするには、-Eオプションが必要です。echozsh

試してみて、あなたの要件を満たしていることを確認してください。

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を削除して\>を>に置き換えます。

関連情報