FIFO経由の情報の受け渡し
http://blog.miraclelinux.com/ctd/2006/09/post_a92f.html
bash であれば、名前なしパイプを生成してプロセスに接続するための構文があります。
う〜ん、うまくいかない。
FIFO経由はうまくいった。
しかし、このexecの使い方って普通なんだろうか?コマンドが無くて、fdをコピーしてるだけ。
fifoから取得したデータの表示
sample.sh
#!/bin/bash #FIFOの作成 mknod /tmp/fifo1 p #FIFOから読み込んだデータを表示*1 cat </tmp/fifo1 & #fd 5番に/tmp/fifo1 のディスクリプタをコピー exec 5>/tmp/fifo1 #/tmp/fifo1は用なし rm /tmp/fifo1 #サブシェルで client.sh を動かしたい。 (:;./client.sh)
client.sh
#!/bin/bash function close_fd() { # exec 5>&- echo bye! exit 0; } #C-cでfd 5番を閉じるようにする。fd5番が閉じると、自動的に*1も終了。 trap close_fd 2 while ((1)); do echo hoge >&5 sleep 3 done
CygwinのbashでのCRの扱い
http://cygwin.com/ml/cygwin-announce/2006-12/msg00026.html
によるとbash-3.2.9-10からCRが、改行(shではコマンドの区切り)ではなく、CRそのものとして扱われるようになったらしい。
ということで、shellスクリプトの改行コードがCRLFの場合、
#!/bin/sh echo "hello world!"
みたいな単純なコードでも
./sample.sh: line 2: $'\r': command not found
と、CRがコマンドのように扱われてしまいます。
解決法としては、メールにあるように、スクリプトのどこか(interactive shellの場合は、.bashrcとか)に、↓のようにigncrオプションを設定してCRを無視するようにすればOK。
#&&の前のコマンドは、古い環境でスクリプトが実行されて、igncrオプションが無い場合のための対処。
(set -o igncr) 2>/dev/null && set -o igncr;
さらに、サブシェルもすべて上記設定を適用させるには、
bash (set -o igncr) 2>/dev/null && set -o igncr; export SHELLOPTS
のように、SHELLOPTSをexportすべし。