% 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_SHELL
kabuğu düzeltmek için değişken).
Veya komutu parallel
için yaptığınız gibi ilettiğiniz bir komut değil , bir kabuk komut satırı ( komut için yaptığınız gibi ).env
xargs
eval
İçin eval
, in parallel arg1 arg2
gibi 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, parallel
bunları 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 parallel
Changelog'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 -c
ile echo foo foo\'bar
komut satırı olarak. Ve eğer içinden denilen rc
(veya birlikte PARALLEL_SHELL=rc
) rc -c
ile 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ı parallel
gelen, o geçer <that-shell> -c
hangi arayacak bash -c echo
ile :$1
de $0
ve güncel argüman $1
.
Böyle değil parallel
. Burada muhtemelen şunları istersiniz:
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
Ne parallel
iş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 xargs
yerine parallel
yakı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' '' foo
yaptığınızı unutmayın $0
. $0
Hata 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 bash
ve bunun echo
genellikle keyfi veriler için kullanılamayacağını unutmayın.