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

1695
William Casarin

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

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

3

2 ответа на вопрос

1
johnshen64

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

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

в то время как :; делать xargs </ tmp / cmds; сделанный

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

0
William Casarin

Если кому-то интересно, вот скрипт, который я использую для отправки команд из vim:

#!/bin/sh FIFO=$ 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> 

Повеселись!