Описание тега chili
Чтобы визуализировать то, что происходит, сравните следующие два варианта:
начиная с bash-c 'на Эхо привет | тройник >(сна 1; Эхо лет); Эхо $?'
начиная с bash-c 'на wait_and_tee () { выспаться 1; ти "$@"; };
Эхо привет | wait_and_tee >(Эхо лет); Эхо $?'
Обратите внимание, что происходит в первом варианте?
$ Баш-с 'Эхо привет | тройник >(спящий режим 1; Эхо лет); Эхо $?'
привет
0
$ йоу
Команда в процессе замещения сон 1; Эхо-йо
выполняется параллельно с команды за пределами, и Баш не ждать его до конца. Итак, последовательность событий:
- Три команды
Эхо привет
,сон 1; Эхо-йо
ифутболка
запускаются параллельно. Эхо привет
пишетПривет
в свой выходной (в|
труб).тройник
чтение из канала и запись в стандартный поток вывода и аргумента командной строки, который является другая труба, созданные>(...)
. Это приводит в одном экземплярепривет
напечатанный на терминале, и одну копию в буфер>(...)
трубы.- Параллельно с предыдущим пуля точки,
Эхо привет
выходов, который закрывает писать конец|
трубы. тройник
замечает, что он достиг он конца входного файла. Она написала все свои данные, так что он выходит.- С точки зрения Баша, обе стороны трубы выходят, поэтому команда закончилась. Поскольку
тройник
возвращается 0, статус газопровода-0. - Секунду спустя,
сна 1
заканчивается, иЭхо йо
выполняется.
Во втором варианте, я силой Эхо-йо
, чтобы завершить, прежде чем тройник
, вынудив ее прекратить до тройника
начинается. В этот раз последовательность событий:
- Три команды
"Эхо" привет
,Эхо йо
исна 1
запускаются параллельно. Эхо привет
пишетПривет
в свой выходной (в|
труб).- Параллельно с предыдущим пункте,
Эхо йо
гравюрыйо
и выходы. - Секунду спустя,
сна 1
выход итройник
начинается. тройник
читаетпривет
от его ввода и попытки писать как на терминал (стандартный вывод) и труба в результате>(...)
передана в качестве аргумента. Поскольку процесс, который эту трубу открыть для чтения (Эхо-йо
) вышел секунду назад, попытка записи в канал выдает сигнал sigpipe, (сигнал 13, который в консоли отчетов как 128+signal_number).
Как G-Man объясняет, то ли "привет"
отображается во втором случае зависит от того, тройник
пытается писать на стандартный вывод или файл аргумент первый.
Без сна,
звонки, сроки может уйти в любую сторону (я понимаю, примерно половина/половина под Linux, другое ядро может сделать одно время много чаще, чем другие).