search
LoginSignup
7

More than 5 years have passed since last update.

posted at

updated at

zshでコマンドラインサーバー、zrv.zshのご紹介

極稀に、今入力しているコマンドを、別の端末の上で既に動いている zsh で実際に入力したように実行したいということがあったので作ってみました。

デモ動画はこちらから (http://www.youtube.com/watch?v=AfPgznZvBr8h):

zrv.zsh

ソースコードはこちらから (https://github.com/hchbaw/zrv.zsh.git)

使い方です。

ファイルを autoload して zrv を呼び出してサーバーをスタートします。

% tmux
;# サーバー側はtmux上で動かすのが必須です
% git clone https://github.com/hchbaw/zrv.zsh.git
% fpath+="$(echo ${:-./zrv.zsh}(:A))"
% autoload -Uz zrv
% zrv

クライアント側では以下の zrv-client のような関数を使って通信します。

zrv-client () {
  local -i REPLY;
  setopt localoptions errreturn
  zmodload zsh/net/socket
  zsocket /tmp/zrv-${UID}/default
  print -u $REPLY "$1"
  exec {REPLY}>&- # このファイルディスクリプタ閉じるのを忘れないで!
}

関数を定義したら例えば以下のような感じに使うことができます。

% zrv-client "echo hi"
⇒ "echo hi" をサーバーに送信、サーバー側で実行、表示します。
% zrv-client "sleep 5
echo hihi"
⇒ サーバーに復数のコマンドを送信、サーバー側では一行すつ実行、表示します。

以下雑感です。

プロトコルを考えるのはつらかったので、クライアントから切断された後、送ったコマンドが実行される、ということにしました。

accept-line の後に何かキーを押さないと実行されなかったのでこんな感じになっていて、サーバー側は tmux 上じゃないと動作しません。

recursive-edit 内でないと $BUFFER を更新しても実際のコマンドラインに反映されなかったので、やっぱりこんな感じになっています。

といった、強引にねじふせたおもちゃです。正直なんだかなあという感じになっちゃったサーバーですけれども少しは遊べます。

自分では主に、今いるウインドウの横のウインドウで、サーバーが表示されているペインを表示して、今いるウインドウのコマンドラインの内容を $PWD への cd も伴って送信する、などしています。

なんだろ、このコマンドを実行しちゃうと出力でウインドウ一ぱいになっちゃいそう、とか、コマンドの結果が返ってくるのに微妙に時間経かりそうだ、という時にサーバー側で実行して、その次のコマンドを入力し始める、みたいな使い方です。

ごめんなさい長くなっちゃった。おつかれ様でした!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7