保持 bash 在命名管道上打开

保持 bash 在命名管道上打开

我正在寻找从 vim 向单独的 tmux 窗格发送命令的方法,我认为最简单的方法是 mkfifo 一个命名管道/tmp/cmds并运行bash < /tmp/cmds以监听要运行的命令。

然后我进行echo "echo \"hello world\" > /tmp/cmds"测试,这只对一个命令有效,并且 xargs 立即关闭。有没有办法让它在多个命令后继续运行?

答案1

这与在交互式 shell 上运行 xargs 并以换行符终止没有什么不同,因此它将完成并退出。

你必须编写一个循环并针对来自 stdin 的每一行输入执行,例如

while :; 执行 xargs < /tmp/cmds; 完成

尚未测试,因此您可能需要进行调整。

答案2

如果有人好奇,下面是我用来从 vim 发送命令的脚本:

#!/bin/sh
FIFO=${1:-"/tmp/cmds"}
mkfifo $FIFO &> /dev/null
while :; do bash < $FIFO && echo "== OK ==" || echo "!! ERR !!"; done

这是一个向该管道发送命令的 vim 函数:

function! RCmd(cmd)
  :silent! exe '!echo "cd ' . getcwd() . ' && ' . a:cmd . '" > /tmp/cmds'
  :redraw!
endfunction

make发送到窗口的映射<F4>

map <F4> :call RCmd("make")<CR>

玩得开心!

相关内容