Korn――高機能なシェルBeginner's Guide(3/3 ページ)

» 2008年05月13日 10時00分 公開
[Mark-Alexander-Bain,Open Tech Press]
SourceForge.JP Magazine
前のページへ 1|2|3       

コプロセス

 bashを使いなれているのなら、「|」記号で表わす「パイプ」についてはおそらくすでに知っていることだろう。パイプを使えば、あるプロセスの出力を別のプロセスの入力として与えることができる。Kornシェルのコプロセスは、言ってみれば単に双方向のパイプだ。コプロセスを使えば、バックグラウンドプロセスとフォアグラウンドプロセスとがお互いに通信することができる。使い方は簡単で、「|&」記号を使ってプロセスをバックグラウンドで実行すれば、「print -p」でそのプロセスに情報を送ることができて、「read -p」でそのプロセスの出力を受け取ることができる。

 それではまず、バックグラウンドで実行するためのスクリプトを作成しよう。次に示すスクリプトは、入力として数字を受け取って、これまでに入力された値の合計を出力する。

#!/bin/ksh

total=0

while [ "" == "" ]

do

read input

(( total = total + input ))

echo $total

done


このスクリプトをkeep_count.kshとして保存しておけば、コマンドラインでもスクリプトの中でも、以下のような形で使用できるようになる。

./keep_count.ksh |&

print -p 2

read -p x # xの値は2

print -p 10

read -p x # xの値は12


 バックグラウンドで実行するプロセスの数は幾つでもよい。しかし幾つもプロセスを起動すると通信したいプロセスをどうやって指定したらよいのかが問題になる――とは言ってもKornシェルではそれもたいした問題ではない。というのも、各パイプのファイルディスクリプタを再定義できるからだ。

./ keep_count.ksh |&

exec 4>&p # 入力を再定義する

exec 5<&p # 出力を再定義する

print -u4 1

read -u5 x # xの値は1

./ keep_count.ksh |&

exec 6>&p

exec 7<&p

print -u4 1

read -u5 x # xの値は2

print -u6 1

read -u7 y # yの値は1


最後に2点ほど

 冒頭でKornシェルにはbashとの完全な後方互換性があると述べたが、実際にはbashとは異なる点もある。例としては履歴機能がある。bashで「history 100」を実行すると、直近の100個分のコマンド履歴のエントリが表示されるが、同じことをKornシェルで実行すると、履歴ファイルの100行めからの全履歴が表示される。なおKornシェルの場合、再び実行したい行を見つけたら「r」と行番号を入力すればよい。

>history

1069 ls -l /lib/ast/ksh

1070 ls -l /bin/ksh93

1071 html2text -style pretty /home/bainm/Articles/Bain_ksh.html | wc -w

1072 grep bainm /etc/passwd

1073 ps -ef | grep firefox

1074 kill -9 3639

>r 1071


 もう1つKornシェルを使い始めたときに気づくかもしれない点として、上矢印キーを入力した際に、最後に入力したコマンドではなく制御文字が表示されるということがある。これは左/右/下矢印キーを入力した場合についても同じだ。しかしこの点は簡単に改善でき、「set -o emacs」という一行を/etc/.kshsrcファイルに追加しておけば、次回シェルを起動したときには、矢印キーは慣れ親しんだ通りの動作をするだろう。

前のページへ 1|2|3       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ