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 bashche sono usati per formare operatori speciali in diverse combinazioni. <, <(, <<, <&... hanno ciascuno il proprio ruolo. <è per il reindirizzamento. <file, < filereindirizzerebbe 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 fishshell, è 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 bashsostituzione del processo.
Nella yashshell, 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 txtepng 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 lqualificatore 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 expectederrore 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 we / o catnella directory corrente ...