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