Почему встроенное эхо рыбы отличается от встроенного в 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
встроенный, поэтому значение не отображается для следующей команды. Это должно дать вам некоторое понимание того, почему рыба всегда работает напрямую со встроенными.