初歩のシェルスクリプトで遊ぶ[ファイルのリネームツール、のようなもの?_(3)]
パイプを再帰で繋いでみるテスト
#!/bin/bash : << '#----------------------------------------------------------------------------------comment' ■ ミニburdock --onceのみ パイプの再帰つなぎテスト #----------------------------------------------------------------------------------comment pipeRecursiveOnceFunc(){ # 位置パラメータが1個以上あるならば、 if test "${#}" -ge 1 ; then # 位置パラメータ${1}を変数に受け取って、ひとつshift CMD_1D="${1}" shift 1 else # 位置パラメータが無いなら、標準入力をそのまま標準出力する cat - exit 0 fi # 標準入力をreadで1行ずつ受け取る while IFS= read -r LINE ; do # 元位置パラメータを展開、evalでコマンドとみなして、 # 標準入力から来たデータをコマンドに入力、 # そのまま標準出力する eval 'echo "${LINE}" | '"${CMD_1D}" # whileループからの標準出力を、すべて、この関数自身に再帰入力 # 位置パラメータは、shiftで一個減らしたものを # ふたたび位置パラメータに全て与える done | pipeRecursiveOnceFunc "${@}" } pipeRecursiveOnceFunc "${@}"
#!/bin/bash : << '#----------------------------------------------------------------------------------comment' ■ ミニburdock --loopのみ パイプの再帰つなぎテスト #----------------------------------------------------------------------------------comment pipeRecursiveLoopFunc(){ if test "${#}" -ge 1 ; then CMD_1D="${1}" shift 1 else cat - exit 0 fi eval 'while IFS= read -r LINE ; do echo "${LINE}" done | '"${CMD_1D}"' | pipeRecursiveLoopFunc "${@}"' } pipeRecursiveLoopFunc "${@}"
簡易型の『burdock』のテストで、標準入力された文字データを、引数に与えたコマンドでevalして加工していく。
昨日の「(2)」で書いた、パイプでつないで並列処理できねーかな、の実装例として、試しにやってみた。
位置パラメータが単純にコマンドの文字列だけだってんなら、こうやって簡単に書けるんだけど。他のオプションをどうやって処理するかだとか、パイプの先にシェル変数がどこまで受け継がれてくれるか、だとか。
そのへんの判断が、シェルの仕組みに詳しくない私だと、難しくてどうとも。
並列処理になって、いるような気はするんだけど、なんかちょっと、重い気がする。並列にはなっても結局は重いんだったら、実用性は無いんだし。
確かに昨日書いたような、コマンドの文字列を作ってeval、よりは、こっちのほうがなんとなく格好いいことをしてる、ように見えるんだけどもさ。再帰って、なんかおっかない。
勉強目的なら、このやり方でやってみるのは悪くないとは思うんだけども。重くても、難しくてトラブルまみれでも、いいなら。