これは私のコードです
#!/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
︙
コマンドに渡された引数はbash
bash環境に渡されますが、0から始まります。したがって、関数内では
$0
"_
"、$1
"This
"です。$0
"_
"、$1
"is
"です。$0
"_
"、$1
"a
"です。- ︙
バラより位置引数を持つ Bash -c。
これはexport -f
Bashでのみ動作し、()はGNUでのみ動作します。-Pn
--max-procs=max-procs
xargs
答え2
代替ソリューションを追加すると、代わりparallel
に作業が簡単になりますxargs
。parallel
#!/bin/bash
showword() {
echo $1
}
export -f showword
parallel -j2 showword {} ::: This is a sample message
-j2
関数の2つのコピーが並列に実行されていることを確認してください。:::
parallel
これ以降の内容は、スペースで区切られた別の引数として渡されます。{}
parallel
showword
関数に渡されたパラメータに置き換えられました
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