在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 ...
可能超时。
或许我接近这个错误的方式?
答案 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
期间出现并滚动走。