Ponieważ tak ma być.
<(...)
in bash
to składnia podstawiania procesów. Jest skopiowany od tego samego operatora w ksh
.
<
, (
, )
, |
, &
, ;
Są specjalne tokeny leksykalne w bash
które są stosowane do tworzenia specjalnych operatorów w różnych kombinacjach. <
, <(
, <<
, <&
... każdy ma swoją rolę. <
służy do przekierowania. <file
, < file
przekieruje 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 fish
powł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ż bash
podstawianie procesów.
W yash
powł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 bash
gdy <(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ę txt
i png
pliki) 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. l
Glob 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 expected
błą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 w
i / lub cat
plików w bieżącym katalogu ...