Я не уверен, что есть все оболочки, но в Bash это возможно, хотя и не с безымянными каналами. Так что не с символом |
. Но если вы создадите именованный канал:
mkfifo fifo
Тогда вы сможете его использовать:
<fifo cat | cat >fifo &
Теперь конвейер работает в фоновом режиме, но ничего не делает. Но если вы подадите трубу из-за пределов конвейера:
echo x >fifo
Конвейер разблокируется и будет работать вечно. Или пока вы не осушите трубу:
cat fifo
Вывод появится один раз:
x
Чтобы сделать это немного сложнее, конвейер может быть таким:
<fifo cat | xargs -I@ echo @x >fifo &
Таким образом, он добавит x
к выводу на каждой итерации. Конечно, будет, но только после того, как начнутся итерации, то есть как только канал разблокируется, то есть как только будет что читать. Как и раньше, это можно запустить вручную:
echo x >fifo
А теперь посмотрите, что показывает top
. Должно быть довольно много активности как cat
, так и xargs
.
И так же, как и раньше, если вы осушите конвейер, вы должны увидеть много x
s в терминале, и конвейер заблокируется.
Возникает закономерный вопрос, почему опорожняется трубопровод. Почему команда cat
фиксируется в терминале, не оставляя ничего в цепи. Я не знаю этого.
В вашем примере вы не написали сценарий; это функция. Таким образом, вы применяете kill
к сеансу интерактивной оболочки. Интерактивные оболочки игнорируют большинство сигналов, включая SIGTERM
, которые вы отправляете.
Поместите функцию и ее вызов в сценарий и запустите его. Гораздо больше шансов сделать то, что вы ожидаете.
попробуйте следующее, если вы хотите использовать его как функцию непосредственно в bash, соответственно, полученную из консоли.
function testKill
{
kill $PPID
echo "no hello :-/"
}