% 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
シェルコマンドライン(コマンドに渡す方法)です。env
xargs
eval
forと同様に、eval
inは引数を中間スペースにparallel arg1 arg2
連結して対応するparallel
文字arg1 arg2
列をに渡します<the-shell> -c
。
parallel
stdinに渡された引数の場合は、特定のシェルで予想される形式で引用してください(これは難しくてエラーが発生しやすいため、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 {}
そして、{}
呼び出し中のシェルの正しい形式に展開して引用し、inと現在の引数を使用して呼び出したいシェルparallel
に渡します。<that-shell> -c
bash -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
任意のデータと一緒に使用することはできません。