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
冒頭で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ファイルに追加しておけば、次回シェルを起動したときには、矢印キーは慣れ親しんだ通りの動作をするだろう。
Copyright © 2010 OSDN Corporation, All Rights Reserved.