GNUパラレルが "bash -c"で動作しないのはなぜですか?

GNUパラレルが "bash -c"で動作しないのはなぜですか?
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}


%

2番目の行も同じように機能したいです。

答え1

parallelコマンドがシェルで実行されました(経験的方法を使用してそのシェルが何であるかを確認します(呼び出しシェルと同じシェルを呼び出すことをparallel目的)。parallel~から)。この$PARALLEL_SHELL変数を設定してシェルを変更できます.)

or command に渡すコマンドではなく、parallelシェルコマンドライン(コマンドに渡す方法)です。envxargseval

forと同様に、evalinは引数を中間スペースにparallel arg1 arg2連結して対応するparallel文字arg1 arg2列をに渡します<the-shell> -c

parallelstdinに渡された引数の場合は、特定のシェルで予想される形式で引用してください(これは難しくてエラーが発生しやすいため、parallel変更ログで修正された多くのバグを見つけることができます(parallel一部2017年3月6日現在、まだ修正されていません。))これを適切なコマンドラインに追加してください。

たとえば、内部で呼び出される場合bash

echo "foo'bar" | parallel echo foo

コマンドラインと並行しbash -cて呼び出されますecho foo foo\'bar。を使用して内部でrc(または使用してPARALLEL_SHELL=rc)呼び出す場合。rc -cecho foo foo''''bar

あなたの場所:

parallel bash -c 'echo :\$1' '' {}

parallelこれらのパラメータをリンクすると、次のものが提供されます。

bash -c echo :$1  {}

そして、{}呼び出し中のシェルの正しい形式に展開して引用し、inと現在の引数を使用して呼び出したいシェルparallelに渡します。<that-shell> -cbash -c echo:$1$0$1

そのようなことは起こりませんでしたparallel。ここでは、次のことができます。

printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'

それが何であるかを見るには(またはLinuxでない場合はシステムで同等のもの)で実行parallelできます。strace -fe execve

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任意のデータと一緒に使用することはできません。

関連情報