xargsで定義された関数を使用する方法

xargsで定義された関数を使用する方法

これは私のコードです

#!/bin/bash

showword() {
  echo $1
}

echo This is a sample message | xargs -d' ' -t -n1 -P2 showword

showwordしたがって、関数に引数として渡す文字列をエコーする関数があります。

その後、xargs関数を呼び出し、一度に1つの単語を渡し、関数の2つのコピーを並列に実行してみました。うまくいかないのは、xargs機能が認識されないことです。私が望むことをどのように達成できますか? xargsがこの機能で動作するようにするにはどうすればよいですかshowword

答え1

関数をエクスポートしてサブシェルから呼び出してみてください。

showword() {
  echo $1
}

export -f showword
echo This is a sample message | xargs -d' ' -t -n1 -P2 bash -c 'showword "$@"' _

これによりxargs実行が発生します。

bash -c 'showword "$@"' _ This
bash -c 'showword "$@"' _ is
bash -c 'showword "$@"' _ a

コマンドに渡された引数はbashbash環境に渡されますが、0から始まります。したがって、関数内では

  • $0" _"、  $1" This"です。
  • $0" _"、  $1" is"です。
  • $0" _"、  $1" a"です。
  •       ︙

バラより位置引数を持つ Bash -c

これはexport -fBashでのみ動作し、()はGNUでのみ動作します。-Pn--max-procs=max-procsxargs

答え2

代替ソリューションを追加すると、代わりparallelに作業が簡単になりますxargsparallel

#!/bin/bash

showword() {
  echo $1
}
export -f showword

parallel -j2 showword {} ::: This is a sample message
  • -j2関数の2つのコピーが並列に実行されていることを確認してください。
  • :::parallelこれ以降の内容は、スペースで区切られた別の引数として渡されます。
  • {}parallelshowword関数に渡されたパラメータに置き換えられました

zshには機能をエクスポートする機能がないため、zshシェルを使用してもこのソリューションは機能しません。次のようなものが必要です。

#!/usr/bin/zsh

showword() {
  echo $1
}

# add the following to your .zshrc if you want env_parallel in your shell permanently
source /usr/bin/env_parallel.zsh

env_parallel -j2 --env showword showword {} ::: This is a sample message

答え3

パラメータを受け取り、何でも行う関数を作成しましょう(私の関数はそれを2回印刷します)。

$ twice() { echo $1$1 }

$ twice "hello"
hellohello

入力を読み取らないため、パイプでは機能しません。

$ echo "hello" | twice
<nothing>

一時変数の入力を読むだけでこの問題を解決できます。

$ echo "hello" | read s; twice $s
hellohello

またはアクセシビリティを使用してください

$ call() { read s; $1 $s }

$ echo "hello" | call twice
hellohello

関連情報