Perché è così che deve essere.
<(...)
in bash
è la sintassi per la sostituzione del processo. Viene copiato dallo stesso operatore in ksh
.
<
, (
, )
, |
, &
, ;
Sono token lessicali speciali bash
che sono usati per formare operatori speciali in diverse combinazioni. <
, <(
, <<
, <&
... hanno ciascuno il proprio ruolo. <
è per il reindirizzamento. <file
, < file
reindirizzerebbe l'input da un file. <'(file)'
reindirizzerebbe l'input da un file chiamato (file)
, ma <(file)
è un operatore diverso che non è un operatore di reindirizzamento.
< (file)
sarebbe <
seguito da (file)
. In tale contesto, in bash
, (file)
non è valido. (...)
può essere valido come token singolo in alcuni contesti come:
(sub shell)
func () {
...
}
var=(foo bar)
Ma non dentro
sort < (cmd)
Nella fish
shell, è diverso. Nelfish
, (...)
è per la sostituzione dei comandi (l'equivalente di $(...)
in bash
). Ed <
è per il reindirizzamento dell'input come nelle shell tipo Bourne.
Quindi dentro fish
:
sort <(echo file)
sarebbe lo stesso di:
sort < (echo file)
Questo è:
sort < file
Ma è qualcosa di completamente diverso dalla bash
sostituzione del processo.
Nella yash
shell, un'altra shell POSIX, <(...)
non è per la sostituzione di processo ma per reindirizzamento dei processi
Lì dentro,
sort <(ls -l)
Corto per:
sort 0<(ls -l)
è un operatore di reindirizzamento. È più o meno equivalente a:
ls -l | sort
Mentre in bash
, <(ls -l)
viene espanso nel percorso di una pipe, quindi è più simile a:
ls -l | sort /dev/fd/0
In zsh
, (...)
viene sovraccaricato come operatore globbing ( (*.txt|*.png)
si espanderebbe a txt
epng
file) e come qualificatore glob ( *(/)
ad esempio si espande in file di directory).
In zsh
, in:
sort < (ls -l)
Che (ls -l)
sarebbero trattati come un qualificatore glob. Il l
qualificatore glob deve corrispondere al numero di collegamenti e si aspetta un numero dopo l
(come in ls -ld ./*(l2)
sarebbe elencare i file con 2 collegamenti), quindi è per questo che si ottiene un zsh: number expected
errore lì.
sort < (w)
avrebbe invece dato un zsh: no matches found: (w)
errore in quanto (w)
corrisponde ai file con nome vuoto che sono scrivibili.
sort < (w|cat)
avrebbe ordinato il contenuto dei file w
e / o cat
nella directory corrente ...