Ponieważ tak ma być.
<(...)in bashto składnia podstawiania procesów. Jest skopiowany od tego samego operatora w ksh.
<, (, ), |, &, ;Są specjalne tokeny leksykalne w bashktóre są stosowane do tworzenia specjalnych operatorów w różnych kombinacjach. <, <(, <<, <&... każdy ma swoją rolę. <służy do przekierowania. <file, < fileprzekieruje dane wejściowe z pliku. <'(file)'przekieruje dane wejściowe z pliku o nazwie (file), ale <(file)jest innym operatorem, który nie jest operatorem przekierowania.
< (file)będzie <następnie (file). W tym kontekście, w bash, (file)nie jest ważny. (...)może być poprawny jako pojedynczy token w niektórych kontekstach, takich jak:
(sub shell)
func () {
...
}
var=(foo bar)
Ale nie w
sort < (cmd)
W fishpowłoce jest inaczej. W fish, (...)jest podstawienie poleceń (równowartość $(...)w bash). I <służy do przekierowywania danych wejściowych jak w powłokach podobnych do Bourne'a.
Więc w fish:
sort <(echo file)
byłby taki sam jak:
sort < (echo file)
To jest:
sort < file
Ale to coś zupełnie innego niż bashpodstawianie procesów.
W yashpowłoce kolejna powłoka POSIX <(...)nie służy do zastępowania procesów, ale do przekierowywania procesów
Tam,
sort <(ls -l)
Skrót od:
sort 0<(ls -l)
jest operatorem przekierowania. Jest to mniej więcej odpowiednik:
ls -l | sort
Podczas bashgdy <(ls -l)jest rozwinięty do ścieżki potoku, więc bardziej przypomina:
ls -l | sort /dev/fd/0
W zsh, (...)jest przeciążony jako operator globowania ( (*.txt|*.png)rozwinie się txti pngpliki) i jako kwalifikator glob ( *(/)na przykład rozszerza się do plików, katalogów).
W zsh: w:
sort < (ls -l)
To (ls -l)byłoby traktowane jako kwalifikator globalny. lGlob kwalifikator jest dopasowanie na liczbie linków i oczekuje wiele po l(jak ls -ld ./*(l2)by wyświetlić listę plików z 2 linków), więc to dlaczego masz zsh: number expectedbłąd istnieje.
sort < (w)dałby zsh: no matches found: (w)błąd zamiast jako (w)meczów pliki z pustą nazwą, które są zapisu.
sort < (w|cat)posortowałby zawartość plików wi / lub catplików w bieżącym katalogu ...