% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
2行目も同じように動作すると思います。
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
2行目も同じように動作すると思います。
回答:
parallel
(それはによって決定されるシェルれ、既にシェルでコマンドを実行しますparallel
(意図が1が同じシェルを起動するという経験則を使用してparallel
呼び出されたから)。あなたが設定できる$PARALLEL_SHELL
シェルを修正するための変数)。
これparallel
は、env
or xargs
コマンドの場合のように渡すコマンドではなく、(コマンドの場合のように)シェルコマンドラインですeval
。
forと同様にeval
、inはparallel arg1 arg2
、parallel
それらの引数を間にスペースを入れて連結し(そうなるとarg1 arg2
)、その文字列がに渡され<the-shell> -c
ます。
parallel
の標準入力で渡される引数については、parallel
その特定のシェルで期待される形式でそれらを引用符で囲みます(困難でエラーが発生しやすいタスクです。そのため、parallel
の変更ログ(いくつかは、まだ2017年3月6日の時点で固定されていない)されている)、そのコマンドラインに追加します。
たとえば、内から呼び出された場合bash
、
echo "foo'bar" | parallel echo foo
コマンドラインとして並列呼び出しbash -c
がありecho foo foo\'bar
ます。そして、からrc
(またはPARALLEL_SHELL=rc
)rc -c
で呼び出された場合echo foo foo''''bar
。
あなたの中で:
parallel bash -c 'echo :\$1' '' {}
parallel
以下を与える引数を連結します:
bash -c echo :$1 {}
し、{}
あなたが呼んでいるシェルのための適切なフォーマットに展開して引用されたparallel
から、にすることを渡さ<that-shell> -c
れた呼び出しますbash -c echo
と:$1
中$0
とで現在の引数$1
。
それはどのようにparallel
機能するかではありません。ここでは、おそらく次のようになります。
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
動作を確認するにparallel
は、それを実行strace -fe execve
します(Linux以外の場合は、システムで同等のもの)。
ここでは、xargs
代わりにGNU を使用parallel
して、より単純な処理を期待しているものに近づけることができます。
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.htmlのディスカッションも参照してください
ではbash -c 'echo foo' '' foo
、$0
そのインラインスクリプトに空の文字列を作成していることに注意してください。これは$0
エラーメッセージでも使用されるため、回避します。比較:
$ bash -c 'echo x > "$1"' '' /
: /: Is a directory
と。
$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory
また、変数を引用符で囲まないままにしておくことは非常に特別な意味がbash
あり、echo
通常、任意のデータには使用できません。