Другая возможность состоит в том, чтобы сделать это вручную. Однако я только сделал бы это, если опции Ignacio предлагают в его ответе, недоступны:
timeout_f () {
$1 &
sleep $2
kill $! # ends somecommand if still running
}
timeout_f 'somecommand --someoptions' 10 && #need 2 &'s
echo "forked.." # happens immediately
SIGPIPE только отправляется, когда программа пытается записать в закрытый канал. Это было бы довольно плохо для отправки SIGPIPE иначе: программы, которые, оказывается, имеют открытый канал, даже не могут знать о нем и не должны быть закрыты, если они никогда не взаимодействуют с каналом.
В for i in 1 2 3; do sleep 1; echo $i; done
, sleep
команда ничего не пишет, таким образом, она не получит сигнал. Это только когда echo
выполнения, которые отправляется SIGPIPE.
В целом SIGPIPE не разработан для работы точности. Это только предназначено, чтобы гарантировать, чтобы программы, задание которых состоит в том, чтобы произвести некоторый вывод, не продолжали бежать навсегда, когда потребитель того вывода уходит. В большинстве практических сценариев программа на левой стороне канала буферизует записи, и это только получит SIGPIPE в следующий раз, когда это сбрасывает свой буфер.
Если Вы хотите остановить цикл после многих повторений, встройте ту логику в цикл.
На моих различных оболочках (ksh, zsh, удар), у меня есть ожидаемое поведение: я только имею 1, 2, не 3. Проблема здесь может быть связана о том, как SIGPIPE обрабатывается на Вашей версии ZSH.
Можно ли попытаться выполнить эти команды скручивание жгутов экземпляр "без ENV"? например, без псевдонима, конфигурации, и т.д...
Как вставлено комментарии, оболочка получает ошибку, когда он хочет повторить что-то (с записью () функция). Пока целая цепочка канала работает ( head
процесс все еще работает, и имейте его открытый STDIN), все идет прекрасное. Но когда head
завершается, вывод Вашей оболочки никуда не пойдет (поврежденный канал).
Но пока оболочка не пытается записать что-то в его stdout, он не знает, что канал повреждается и продолжает его обработку.
Таким образом Вы будете видеть "эхо 3" в отладке, которая приведет к сбою и завершает оболочку.