Тому що так мається бути.
<(...)в bash- це синтаксис заміщення процесу. Він скопійований з того самого оператора в ksh.
<, (, ), |, &, ;Спеціальні лексичні маркери в bashякі використовуються для формування спеціальних операторів в різних комбінаціях. <, <(, <<, <&... кожен має свою роль. <призначений для перенаправлення. <file, < fileбуде перенаправляти введення з файлу. <'(file)'буде перенаправляти вхід з файла, який називається (file), але <(file)це інший оператор, який не є оператором перенаправлення.
< (file)буде <слідувати (file). У цьому контексті, в bash, (file)не вірно. (...)може бути дійсним як один маркер у деяких контекстах, таких як:
(sub shell)
func () {
...
}
var=(foo bar)
Але не в
sort < (cmd)
У fishшкаралупі все інакше. В fish, (...)призначений для підстановки команд (еквівалент $(...)в bash). І <призначений для перенаправлення вводу, як у оболонок, подібних до Борна.
Так у fish:
sort <(echo file)
буде те саме, що:
sort < (echo file)
Це є:
sort < file
Але це щось зовсім інше, ніж bashпроцес заміщення Росії.
В yashоболонці, інший POSIX оболонка, <(...)не для заміщення процесу , але і для перенаправлення процесу
Там,
sort <(ls -l)
Короткий термін для:
sort 0<(ls -l)
є оператором перенаправлення. Це більш-менш еквівалентно:
ls -l | sort
Перебуваючи в bash, <(ls -l)розгорнуто до шляху труби, тож це більше схоже на:
ls -l | sort /dev/fd/0
В zsh, (...)перевантажений як оператор будуються по ( (*.txt|*.png)буде розширюватися txtі pngфайли) , а також Глоб класифікатором ( *(/)наприклад , розширюється до файлів каталогу).
В zsh, в:
sort < (ls -l)
Це (ls -l)трактується як глобальний класифікатор. lГлоб класифікатор повинен відповідати за кількістю посилань і очікує , що число після l(як ls -ld ./*(l2)би список файлів з 2 посилання), так ось чому ви отримаєте zsh: number expectedпомилку там.
sort < (w)zsh: no matches found: (w)натомість дав би помилку як (w)збіг файлів із порожнім ім'ям, які можна записати.
sort < (w|cat)сортував би вміст wта / або catфайлів у поточному каталозі ...