2005-10-10 (Mon) [長年日記]
_ DocDiffとパイプとzshの<()
SVKの作業ディレクトリでDocDiffを次のように実行したらエラーになってしまった。
$ docdiff --tty <(svk cat foo.txt) foo.txt | lv -c /usr/bin/docdiff:297: /proc/self/fd/18 is not a file. (RuntimeError)
とりあえず、297行目の以下の2行をコメントアウトしたらうまく動いた。
raise "#{ARGV[0]} is not a file." unless FileTest.file?(ARGV[0]) raise "#{ARGV[1]} is not a file." unless FileTest.file?(ARGV[1])
それはそれとして、zshの<()記法って/proc/self/fd以下のファイルを渡してた のね。なるほど。
Linux以外のシステムではどうやるんだろ、と思ってmanを見ると、
If the system supports the /dev/fd mechanism, the command argument is the name of the device file corresponding to a file descriptor; otherwise, if the system supports named pipes (FIFOs), the command argument will be a named pipe.
[zshexpn(1)より引用]
ふむふむ、/dev/fd*1というものがあるのか。 なかったら名前付きパイプを使うんだね、なるほど。
*1 Linuxでは/proc/self/fdへのsymlinkみたい。/dev/fdって何かフロッピーディスクと間違えそうだな。
ご指摘ありがとうございます。件の箇所は、引数がreadableかどうかとdirかどうかをチェックするように直しておこうと思います。<br>ところで、zshであれば、 <() の代わりに =() を使ってとりあえず回避するという手もありそうですね。
ちゃんと報告しなくてすみません、よろしくお願いします。<br>=()ならだいじょうぶそうですね。