Porque é assim que deve ser.
<(...)
in bash
é a sintaxe da substituição do processo. É copiado do mesmo operador em ksh
.
<
, (
, )
, |
, &
, ;
São símbolos lexicais especiais em bash
que são usados para formar os operadores especiais em diferentes combinações. <
, <(
, <<
, <&
... cada um tem o seu papel. <
é para redirecionamento. <file
, < file
redirecionaria a entrada de um arquivo. <'(file)'
redirecionaria a entrada de um arquivo chamado (file)
, mas <(file)
é um operador diferente que não é um operador de redirecionamento.
< (file)
seria <
seguido por (file)
. Nesse contexto, em bash
, (file)
não é válido. (...)
pode ser válido como um único token em alguns contextos como:
(sub shell)
func () {
...
}
var=(foo bar)
Mas não em
sort < (cmd)
No fish
shell, é diferente. In fish
, (...)
é para substituição de comando (o equivalente a $(...)
in bash
). E <
é para redirecionamento de entrada como em shells tipo Bourne.
Então em fish
:
sort <(echo file)
seria o mesmo que:
sort < (echo file)
Isso é:
sort < file
Mas isso é algo completamente diferente da bash
substituição de processos.
No yash
shell, outro shell POSIX, <(...)
não é para substituição de processo, mas para redirecionamento de processo
Lá,
sort <(ls -l)
Abreviatura de:
sort 0<(ls -l)
é um operador de redirecionamento. É mais ou menos equivalente a:
ls -l | sort
Enquanto estiver no bash
, o <(ls -l)
é expandido para o caminho de um tubo, por isso é mais como:
ls -l | sort /dev/fd/0
In zsh
, (...)
é sobrecarregado como um operador globbing ( (*.txt|*.png)
seria expandido para txt
e png
arquivos) e como qualificador global ( *(/)
por exemplo, se expande para arquivos de diretório).
Em zsh
, em:
sort < (ls -l)
Isso (ls -l)
seria tratado como um qualificador global. O l
qualificador glob deve corresponder ao número de links e espera um número depois l
(como em ls -ld ./*(l2)
listaria os arquivos com 2 links), é por isso que você recebe um zsh: number expected
erro lá.
sort < (w)
em zsh: no matches found: (w)
vez disso , teria dado um erro, pois (w)
corresponde aos arquivos com um nome vazio que pode ser gravado.
sort < (w|cat)
teria classificado o conteúdo dos arquivos w
e / ou cat
no diretório atual ...