Держать bash открытым на именованной трубе
Я пытаюсь отправить команды на отдельную панель tmux из vim, и я решил, что самый простой способ - это mkfifo именованный канал /tmp/cmds
и беги bash < /tmp/cmds
слушать команды для запуска.
Я тогда делаю echo "echo \"hello world\" > /tmp/cmds"
как тест, это работает только для одной команды, и xargs закрывается немедленно. Есть ли способ сохранить это после более чем одной команды?
2 ответа
Это ничем не отличается от запуска xargs в интерактивной оболочке и заканчивается новой строкой, поэтому он завершится и завершится.
Вы должны написать цикл и выполнить для каждой строки ввода из стандартного ввода, таких как
в то время как:; делать xargs tmp/cmds; сделанный
не проверено, поэтому вам может понадобиться настроить.
Если кому-то интересно, вот скрипт, который я использую для отправки команд из 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>
Повеселись!