% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
İkinci çizginin de aynı şekilde hareket etmesini beklerdim.
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
İkinci çizginin de aynı şekilde hareket etmesini beklerdim.
Yanıtlar:
parallel(Bu tarafından belirlenir olduğunu kabuk hangi zaten bir kabuk komutunu çalıştırır parallel(bir aynı kabuk çağırmak olma niyeti Sezgisel yöntem kullanarak parallelçağrıldı dan ). ayarlayabilirsiniz $PARALLEL_SHELLkabuğu düzeltmek için değişken).
Veya komutu paralleliçin yaptığınız gibi ilettiğiniz bir komut değil , bir kabuk komut satırı ( komut için yaptığınız gibi ).envxargseval
İçin eval, in parallel arg1 arg2gibi parallel, bu argümanları arasındaki boşluklar ile birleştirir (böylece olur arg1 arg2) ve o dize aktarılır <the-shell> -c.
parallel'S stdin'sinden iletilen argümanlar için, parallelbunları belirli bir kabuk tarafından beklenen biçimde tırnak içine alır (zor ve hataya eğilimli bir görevdir, bu yüzden parallelChangelog'da ( bazıları 2017-03-06 itibariyle hala sabit değildir)) ve bunu komut satırına ekler.
Örneğin, içeriden çağrılırsa bash,
echo "foo'bar" | parallel echo foo
Paralel görüşmesi misiniz bash -cile echo foo foo\'barkomut satırı olarak. Ve eğer içinden denilen rc(veya birlikte PARALLEL_SHELL=rc) rc -cile echo foo foo''''bar.
Sizin:
parallel bash -c 'echo :\$1' '' {}
parallel şu argümanları birleştirir:
bash -c echo :$1 {}
İle Ve {}aradığınız kabuk için doğru formatta genişlemiş ve alıntı parallelgelen, o geçer <that-shell> -changi arayacak bash -c echoile :$1de $0ve güncel argüman $1.
Böyle değil parallel. Burada muhtemelen şunları istersiniz:
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
Ne parallelişe yaradığını görmek için strace -fe execve(veya Linux değilse sisteminizdeki eşdeğeri) altında çalıştırabilirsiniz .
Burada, GNU'yu kullanabilirsiniz xargsyerine parallelyakın olursanız ne beklediğini daha basit işleme almak için:
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
Ayrıca https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html adresindeki tartışmaya da bakın.
İçinde, bu satır içi komut dosyası için boş dize bash -c 'echo foo' '' fooyaptığınızı unutmayın $0. $0Hata mesajlarında da kullanıldığı için bundan kaçınırım . Karşılaştırmak:
$ bash -c 'echo x > "$1"' '' /
: /: Is a directory
ile.
$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory
Ayrıca değişkenleri tırnaksız bırakmanın çok özel bir anlamı olduğunu bashve bunun echogenellikle keyfi veriler için kullanılamayacağını unutmayın.