Почему встроенное эхо рыбы отличается от встроенного в bash?

Учитывая функцию bar это работает echo bar я жду каждую секунду bar | cat печатать одну строку каждую секунду. Это не. Он ничего не печатает, пока я не нажму ^C, Кажется, что происходит некоторая избыточная буферизация.

yes | cat работает просто отлично. bar | cat работает как положено в bash.

Что касается того, почему это важно, пожалуйста, посмотрите этот другой вопрос.

1 ответ

Решение

У нас есть команда со встроенным в конвейер:

echo bar | cat

Bash форкирует новые процессы для выполнения встроенных функций в конвейерах. Итак, есть два новых процесса: один для catдругой запустить встроенный echo, Процессы создаются с помощью соединяющих их труб, и они работают независимо.

рыба всегда запускает встроенные клетки напрямую, не создавая для них новых процессов. Так что выполняет echo bar, а затем отправляет вывод cat, Вход и выход для встроенных функций и функций (но не для внешних команд) полностью буферизованы. Мы работаем над устранением этого ограничения, но мы еще не там.

Поведение bash может показаться более желательным в этом случае, но за это стоит высокая цена: встроенные функции и функции выполняют разные функции (или просто не работают) внутри конвейеров. Пример:

echo foo | read some_var ; echo $some_var

В рыбе это установит some_var=foo, как и следовало ожидать. В bash это молча завершается ошибкой: назначение "работает", но только внутри переходного процесса, порожденного для выполнения read встроенный, поэтому значение не отображается для следующей команды. Это должно дать вам некоторое понимание того, почему рыба всегда работает напрямую со встроенными.

Другие вопросы по тегам