Рассмотрим следующую команду:
bash -c "echo x; cat 1" | tee 1
.
Насколько я понимаю, он будет переходить в новую оболочку, писать x
в stdout, писать file 1 not found
в stderr, выходить и возвращать управление родительскому процессу, а также писать x
в stdout и to 1
. Следовательно, я ожидаю, что конечный результат будет x
, а файл 1
содержит именно строку x
.
Однако, это не так. На самом деле файл 1
обычно содержит как минимум два экземпляра x
, а иногда и тысячи строк x
s. При пакетном тесте выполнения команды десять тысяч раз среднее число x
s, записанных в файл, составило 52,3, а медиана - 1. Какой механик вызывает это? Какое распределение вероятностей моделирует это поведение? Я подозреваю, что он условно геометрический и в остальном однородный.
tee
файл открыли для записи, прежде чемcat
открыть его для чтения,x
в файле может быть много ключей. В этом случае «цикл» завершается всякий раз, когдаcat
чтениеtee
выполняется быстрее, чем запись, достигая конца файла.x
s, записанных в файл, составило 4,35. Я думаю, это будет зависеть от загрузки машины.Ответы:
Это очень любопытно, поэтому я попытался исследовать это с помощью strace. Выполнить вашу команду в цикле 1000 раз:
Нашел файл с наибольшим количеством строк (
wc -l */1 | sort -nr | head -n2
) и проверил соответствующийtrace.log
. Я, конечно, вижу много:Где 7567
tee 1
и 7568cat 1
. Они определенно чередуются, так что, да, как и предполагалось, все дело в сроках выполнения (и я представляю себе переключение контекста) двух команд.источник