2013-05-20 4 views
2

У меня есть сценарий, где я хочу сделать эквивалент:Как перенаправить/передать весь вывод сценария оболочки терминала в другую программу из сценария?

myscript | anotherprogram

но изнутри сценарий. Я не хочу ссылаться

mysubtask | anotherprogram

каждый раз я должен запускать мои подзадачи в моем сценарии, я просто хочу, чтобы фильтр начал и все мои OUT & ERR смаршрутизирован (сценарий не является интерактивным).

Таким образом, в конце концов, что я хочу сделать, это

  1. Установите OUT & ERR на вход anotherprogram. anotherprogram будет запускаться только для одного экземпляра скрипта, чтобы весь мой вывод шел к нему.
  2. Выполнить остальную часть моего сценария, как обычно с OUT & ERR моих последующих эху и подзадач выходов собирается anotherprogram непрерывно (я только хочу anotherprogram запустить один раз, то есть в течение всего остального моего скрипта)

ответ

4

Есть два простых способа, которые я могу видеть, чтобы достичь этого. Во-первых, вы можете использовать подоболочку со скобками:

(
    echo hello 
    echo world 
) 2>&1 | anotherprogram 

или вы могли бы использовать exec для перенаправления различных дескрипторов файлов в верхней части вашего сценария

exec > >(anotherprogram) # send stdout to anotherprogram 
exec 2>&1     # merge stderr into stdout 

echo hello 
echo world 
+0

Какой один приводит к сокращению вилок? – CyberSkull

+0

В моей системе (Mac OS X, zsh 5.0.0) есть два вилки в первом случае, ноль во втором. – aymericbeaumet

+0

Я предполагаю, что последний (просто нарисовал 'anotherprogram', а не подоболочку), хотя вы также можете попробовать использовать' {...} 'вместо' (...) 'для группировки команд без необходимости запускать подоболочка. –

Смежные вопросы