В bash, я хочу запустить свою программу (gollum) и использовать часть stderr (номер порта) в качестве аргумента для другой программы. Я перенаправляю stderr на stdout и использую grep и sed для фильтрации вывода. Я получаю результат в стандартный вывод:Трубопровод из долговременного процесса в xargs без эффекта
gollum -p0 2>&1| sed -n -e "s/.*port=//p"
возвращает «56343» и продолжать работать, как Голлум является сервером.
Однако, если я хочу использовать это как аргумент другой программы (т. Е. Эхо, но я хочу использовать его позже, чтобы запустить интернет-навигатор с номером порта) с xargs, он не работает.
gollum -p0 2>&1| sed -n -e "s/.*port=//p" | xargs -n1 echo
Ничего не происходит. Вы знаете, почему, или у вас есть другая идея сделать то же самое.
Благодарим за помощь.
Является ли проблема, что Баш ждет, пока все дети в конвейере умрут, и 'gollum' не умрет (одно кольцо держит его в живых)? –
На самом деле это потому, что голлум не умирает. Я убиваю из других мест, и это работает. Как я могу сделать свою вторую программу, как только номер порта будет возвращен? –
Если 'gollum' не имеет возможности запускаться в режиме« демона », тогда' (gollum -p0 2> & 1 &) | sed ... | xargs ... ', предполагая, что вы должны использовать' xargs'. Подоболочка для '(...)' не ждет, пока 'gollum' умрет. Тем не менее, у вас может быть проблема с 'sed', а не умиранием; возможно, вы будете использовать 'sed -n -e '/ port =/{s /.* port = //; p; q;}'' для остановки после первой строки порта. Я думаю, вам нужны оба уловки; вам нужен процесс, который запускает «gollum», чтобы умереть, и «sed», который анализирует выход, чтобы умереть. –