Porque así es como debe ser.
<(...)
in bash
es la sintaxis para la sustitución de procesos. Se copia del mismo operador en ksh
.
<
, (
, )
, |
, &
, ;
Son tokens léxicos especiales en bash
que se utilizan para formar operadores especiales en diferentes combinaciones. <
, <(
, <<
, <&
... cada uno tiene su papel. <
es por redireccionamiento. <file
, < file
redirigiría la entrada de un archivo. <'(file)'
redirigiría la entrada de un archivo llamado (file)
, pero <(file)
es un operador diferente que no es un operador de redirección.
< (file)
sería <
seguido por (file)
. En ese contexto, en bash
, (file)
no es válido. (...)
puede ser válido como un token único en algunos contextos como:
(sub shell)
func () {
...
}
var=(foo bar)
Pero no en
sort < (cmd)
En la fish
cáscara, es diferente. In fish
, (...)
es para la sustitución de comandos (el equivalente de $(...)
in bash
). Y <
es para la redirección de entrada como en shells tipo Bourne.
Entonces en fish
:
sort <(echo file)
sería lo mismo que:
sort < (echo file)
Es decir:
sort < file
Pero eso es algo completamente diferente de bash
la sustitución del proceso.
En el yash
shell, otro shell POSIX, <(...)
no es para la sustitución de procesos sino para la redirección de procesos.
Ahí,
sort <(ls -l)
Corto para:
sort 0<(ls -l)
es un operador de redireccionamiento. Es más o menos equivalente a:
ls -l | sort
Mientras está adentro bash
, <(ls -l)
se expande a la ruta de una tubería, por lo que es más como:
ls -l | sort /dev/fd/0
En zsh
, (...)
se sobrecarga como operador global ( (*.txt|*.png)
se expandiría a txt
y png
archivos) y como calificador global ( *(/)
por ejemplo, se expande a archivos de directorio).
En zsh
, en:
sort < (ls -l)
Eso se (ls -l)
trataría como un calificador global. El l
calificador global es coincidir en el número de enlaces y espera un número después l
(como ls -ld ./*(l2)
se enumeraría en los archivos con 2 enlaces), así que es por eso que obtiene un zsh: number expected
error allí.
sort < (w)
habría dado un zsh: no matches found: (w)
error en su lugar, ya que (w)
coincide con los archivos con nombre vacío que se pueden escribir.
sort < (w|cat)
habría ordenado el contenido de los archivos w
y / o cat
en el directorio actual ...