Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@hchbaw

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 も伴って送信する、などしています。

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?