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すべし。