завершить работу оболочки сценарий, не дожидаясь первых частей конвейера

Рассмотрим следующий сценарий:

#!/bin/bash
function long_running {
    for i in $(seq 1 10); do
        echo foo
        sleep 100
    done
}

long_running | head -n 1

Он производит ожидаемый результат (одна строка «foo»), но засыпает (на указанные 100 секунд) перед завершением. Я бы хотел, чтобы сценарий завершился немедленно, когда это произойдет. Как я могу заставить bash немедленно завершить работу? Даже изменение последней строки на

long_running | (head -n 1; exit)

или подобное не работает; Я не могу заставить работать set -e , еще одно распространенное предложение, даже если я вызываю сбой, скажем, (head -n 1; false) или тому подобное.

(Это упрощенная версия моего реального кода (очевидно), который не спит; просто создает довольно сложный набор вложенных конвейеров, ищущих различные решения проблемы ограничения; так как мне нужен только один, и мне все равно что я получаю, я хотел бы иметь возможность завершить сценарий, добавив head -n 1 к вызову ...)

6
задан Andrew H. Hunter 24 December 2011 в 23:57
поделиться