1. ホーム
  2. バッシュ

[解決済み】xargsでシェル関数を呼び出す。

2022-04-22 20:37:58

質問

xargsを使って、より複雑な関数を並列で呼び出そうとしています。

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} 
exit 0

これはエラーを返します

xargs: echo_var: No such file or directory

これを達成するためにxargsを使用する方法、または他の解決策(複数可)について何かアイデアがあれば歓迎します。

どのように解決するのですか?

関数をエクスポートするとうまくいくはずです(未検証)。

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

を使用すると、組み込みの printf の代わりに、外部の seq :

printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

また return 0exit 0 のように、その前のコマンドで生成されるかもしれないエラー値をマスクする。また、エラーがない場合はデフォルトなので、やや冗長になります。

は、Bashのコマンドである が可能です。 簡略化される

bash -c 'echo_var "{}"'

を移動させる {} をその中に直接入れてください。 しかし それは コマンドインジェクションの脆弱性 が指摘したように、@Sashaが

以下はその例です。 を使うべきではありません。 を埋め込むことができます。

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019

もう一つの例 なんでやねん :

echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'

これが出力される内容です 安全な形式を使用する :

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)

を使用するのと同等です。 パラメータ化された SQL クエリ を避けるために インジェクション .

を使っています。 date の代わりに、コマンドの代入やエスケープクォートを使用することができます。 rm コマンドは非破壊なので、Sashaのコメントで使用されています。