Потому что так и должно быть.
<(...)
в bash
это синтаксис для замены процесса. Он скопирован с того же оператора в ksh
.
<
, (
, )
, |
, &
, ;
Специальные лексические маркеры в bash
которые используются для формирования специальных операторов в различных комбинациях. <
, <(
, <<
, <&
... каждый имеет свою роль. <
для перенаправления. <file
, < file
перенаправил бы ввод из файла. <'(file)'
будет перенаправлять ввод из файла с именем (file)
, но <(file)
это другой оператор, который не является оператором перенаправления.
< (file)
будет <
затем (file)
. В этом контексте, в bash
, (file)
не является действительным. (...)
может быть действительным как один токен в некоторых контекстах, таких как:
(sub shell)
func () {
...
}
var=(foo bar)
Но не в
sort < (cmd)
В fish
оболочке все по-другому. В fish
, (...)
для подстановки команд (эквивалент $(...)
в bash
). И <
для перенаправления ввода, как в Bourne-подобных оболочках.
Итак, в 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
в текущем каталоге ...