Почему '$ (<file)' эквивалентно '$ (cat file)' в bash? - PullRequest
1 голос
/ 05 апреля 2020

Согласно bash руководству:

Подстановка команды $(cat file) может быть заменена эквивалентной, но более быстрой $(< file).

, но мне не удается понять, почему. Давайте попробуем поближе взглянуть на то, что означает $(< file) и что оно делает:

  1. по определению, конструкция $(command) расширяется до того, что команда записывает в стандартный вывод.
  2. в нашем случае команда равна < file, поэтому она состоит исключительно из перенаправления стандартного ввода в файл . Это что-то пишет в стандартный вывод? Я думаю, что это не так (почему перенаправление стандартного ввода-вывода влияет на стандартный вывод?), Но, очевидно, это происходит, поскольку $(command) расширяется до содержимого файла вместо ничего.

По сути, я не вижу "очевидной" эквивалентности $(cat file) и $(< file). Как это следует из bash синтаксиса? Существует ли специальное правило, объясняющее, почему stdin копируется в stdout в данном конкретном случае (или, вообще, что происходит с потоками для пустых команд, то есть команд, состоящих только из одного или нескольких перенаправлений)? Это «bashism» или такая же эквивалентность сохраняется и для других оболочек (особенно da sh)?

...