2019/11/10

zle を使って特定の条件下のコマンドを実行する際、自動で丸括弧でくくる

前回の記事では peep コマンドを使ってプロセスの終了時に通知を行ないました。
また、peep-mac-tmux というコマンドを作って pid の指定を省略しました。

ですが、 peep-mac-tmux を使う際、上手く動いてくれないパターンがいくつか出てきました。
具体的には以下のようなパターンです。

  • '&&' で繋がれたコマンド
    • peep するのは実行中のコマンドなので、途中のコマンドが終了すると通知してしまう
  • `xargs -L1` のように何度も子プロセスを生成するコマンド
    • 1つの子プロセスが終わった時に通知してしまう

そこで、zsh の機能である zle を使い、これらのパターンの時に括弧で括って実行するようにしました。
丸括弧で括ってあると subshell 内部でコマンドが実行されます。
なので、peep は subshell の pid を peep する事で適切に動作させる狙いです。


環境

  • OS: macOS Mojave 10.14.6
  • Homebrew: 2.1.16-38-ge2c76cc
  • Homebrew/homebrew-core: (git revision 0f36; last commit 2019-11-09)
  • zsh: 5.7.1 (x86_64-apple-darwin18.2.0)


zle とは

zsh command line editor という機能で、man zshzle すると詳細が見られます。

今回の場合、'&&' が含まれる or '|' が含まれる、という時に括弧を追加することにします。
そうして作成したのが以下の call-subshell です。


安直に、egrep で特定の pattern がある時、 BUFFER という vairable を編集する事で追加します。
これで peep-mac-tmux の指定もやりやすくなりました。


無限に増える括弧

さて、peep-mac-tmux しやすくなりました、万歳、とはいかないようです。
この定義ではパターンが含まれるコマンドに、() を追加するので、後のコマンドにもパターンが含まれる。
なので、履歴からコマンドを呼び出すと括弧が増え続けます。これは困る。

そこで括弧が重複しないようにしたのが以下の call-subshell です。


一応、前後に空白があった場合にも対応しています。
これで良し。


まとめ

zle を使うとコマンドを編集できて便利、というお話でした。

ちなみにオチとしては、
  • peep が上手くいくメリット < () がある事で誤爆したりするデメリット
と感じたので、作成して2ヶ月くらいで消してしまいました


参考

0 件のコメント:

コメントを投稿