GNU paralel “bash -c” ile neden çalışmıyor?


9
% 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:


11

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.


4
Pzt dieu! Bu GNU Parallel yazarının yazmış olabileceğinden daha iyi bir cevaptır.
Ole Tange
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.