завершить сценарий оболочки, не ожидая ранних частей конвейера - PullRequest
6 голосов
/ 25 декабря 2011

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

#!/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 к вызову ...)

1 Ответ

3 голосов
/ 25 декабря 2011

Как насчет отправки функции голове таким образом -

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

head -n 1 <(long_running)

Очевидно, что если вы увеличите -n до большего числа, сон включится, но закончится, как только голова будет завершена.

...