如何等待某些文本显示在窗格中

时间:2014-08-07 14:05:21

标签: events tmux

在shell脚本中,我希望能够在等待命令更改窗格中的内容后将密钥发送到tmux会话。

以下是我的一个用例:

tmux send-keys -t ...  'vi .' c-m # This opens NERDTree
sleep 3                           # Sometimes sleep 2 is not enough
tmux send-keys -t ...  c-w l      # Go to tab right

命令可以通过输出触发send key命令,但是如果有更好的方法我会听。

我的第一个想法,实际上对于我简单的第一个用例来说是好的,是一个笨拙的

  function wait_for_text_event
  {
       while :; do
          tmux capture-pane -t ... -p | grep "string triggering completion" && return 0
       done
       # never executed unless a timeout mechanism is implemented
       return 1
  }

现在我可以做到

tmux send-keys -t ... 'vi .' c-m
wait_for_text_event 'README.md'   # meaning NERDTree has opened the split window
tmux send-keys -t ...  c-w l      # Go to tab right

然而 实现超时在shell中已经很棘手,无论如何忙碌的等待都很难看。

是否有一些命令(或实现它的方法)会阻塞直到某些命令 文本显示在窗格中,例如

tmux wait-for-text -t ...“Hello World”&& tmux send-keys ...

可能超时。

或许我接近这个错误的方式?

2 个答案:

答案 0 :(得分:1)

您可以在linux中使用内置超时可执行文件并运行子shell。尝试这样的事情:

# $1: string to grep for
# $2: timeout in s
wait_for_text_event()
{
  timeout $2 bash <<EOT
  while :; do
    sleep 1
    echo "test" | grep $1 2>&1 > /dev/null && break
  done
EOT
  echo $?
}

echo $(wait_for_text_event "text" 5)   # this times out, returncode !=0
echo $(wait_for_text_event "test" 5)   # this passes, returncode == 0

答案 1 :(得分:0)

tmux capture-pane -pJ -S-10000 -t XX将打印窗格XX的内容,从向上滚动最多10000行开始。因此,您应该可以执行类似的操作

until tmux capture-pane ... | grep $TEXT >/dev/null; do :; done

您可能希望添加一个sleep而不浪费CPU,然后包含一些回滚,以防文本在sleep期间出现并滚动走。