Держать bash открытым на именованной трубе

Я пытаюсь отправить команды на отдельную панель tmux из vim, и я решил, что самый простой способ - это mkfifo именованный канал /tmp/cmds и беги bash < /tmp/cmds слушать команды для запуска.

Я тогда делаю echo "echo \"hello world\" > /tmp/cmds" как тест, это работает только для одной команды, и xargs закрывается немедленно. Есть ли способ сохранить это после более чем одной команды?

2 ответа

Решение

Это ничем не отличается от запуска xargs в интерактивной оболочке и заканчивается новой строкой, поэтому он завершится и завершится.

Вы должны написать цикл и выполнить для каждой строки ввода из стандартного ввода, таких как

в то время как:; делать xargs

не проверено, поэтому вам может понадобиться настроить.

Если кому-то интересно, вот скрипт, который я использую для отправки команд из 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>

Повеселись!

Другие вопросы по тегам