綾小路龍之介の素人思考

[weechat] fifoプラグインをシェルスクリプトから使う

本家のFIFO pipeを解説したページにあるauto_weechat_commandは期待したとおりに動かなかったので。

まずはfifoプラグインのおさらい。以下のようにして使う。echo -eを使うことで複数のコマンドを1行でfifoパイプできる。

$ echo -e "core.weechat */plugin reload logger" > ~/.weechat/weechat_fifo_17921
11:46:35 weechat | Plugin "logger" unloaded
11:46:35 weechat | Plugin "logger" loaded
$ echo -e "core.weechat */plugin unload logger\ncore.weechat */plugin load logger" > ~/.weechat/weechat_fifo_17921
11:47:58 weechat | Plugin "logger" unloaded
11:47:58 weechat | Plugin "logger" loaded

本家のページに以下のシェルスクリプトがfifoパイプを使う例として挙げられている。

$ cat auto_weechat_command
#!/bin/sh
if [ $# -eq 1 ]; then
    for fifo in ~/.weechat/weechat_fifo_*
    do
        echo -e "$1" >$fifo
    done
fi

上の2つの例で用いた引数をこのシェルスクリプトに与えると以下のようになる。両方とも失敗する。

$ ./auto_weechat_command "core.weechat */plugin unload logger\ncore.weechat */plugin load logger"
12:00:44 weechat =!= | fifo: error, buffer not found for pipe data
12:00:44 weechat =!= | Error: unable to load plugin "/usr/local/lib/weechat/plugins/logger.so": a plugin with same name already exists
$ ./auto_weechat_command "core.weechat */plugin reload logger"
12:00:46 weechat =!= | fifo: error, buffer not found for pipe data

パイプされた内容をチェックするために、上のスクリプトの$fifoをtest.txtに書き換えて、test.txtの内容を表示すると以下のようになる。これは意図した出力ではない。

$ ./auto_weechat_command "core.weechat */plugin unload logger\ncore.weechat */plugin load logger"
$ cat test.txt
-e core.weechat */plugin unload logger
core.weechat */plugin load logger
$ ./auto_weechat_command "core.weechat */plugin reload logger"
$ cat test.txt
-e core.weechat */plugin reload logger

上のようになる理由はbin/shの中で起動されるechoはcsh組み込みコマンドのechoであり、上の例のbashで起動していた/bin/echoとは異なるからである。そこで以下のように書き換える。

$ cat auto_weechat_command
#!/bin/sh
if [ $# -eq 1 ]; then
    for fifo in ~/.weechat/weechat_fifo_*
    do
        echo "$1" >$fifo
    done
fi

このように書き換えたことで期待通りに動くようになる。

$ ./auto_weechat_command "core.weechat */plugin unload logger\ncore.weechat */plugin load logger"
13:58:11 weechat | Plugin "logger" unloaded
13:58:11 weechat | Plugin "logger" loaded
$ ./auto_weechat_command "core.weechat */plugin reload logger"
13:58:19 weechat | Plugin "logger" unloaded
13:58:19 weechat | Plugin "logger" loaded

リファレンス

  1. FIFO pipe
  2. fifo weechat - Google 検索
  3. UNIXの部屋 コマンド検索: echo_style
  4. UNIXの部屋 コマンド検索:echo (*BSD/Linux)
  5. echo 組み込みコマンド csh - Google 検索
  6. Manpage of ECHO

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-02-12T12:19:30+09:00
  2. Modified: 2010-02-12T12:19:30+09:00
  3. Generated: 2017-02-17T23:09:18+09:00