Parce que c'est comme ça que ça se passe.
<(...)
in bash
est la syntaxe pour la substitution de processus. Il est copié du même opérateur dans ksh
.
<
, (
, )
, |
, &
, ;
Sont des jetons lexicaux spéciaux bash
qui sont utilisés pour former des opérateurs spéciaux dans différentes combinaisons. <
, <(
, <<
, <&
... ont chacun leur rôle. <
est pour la redirection. <file
, < file
redirigerait l’entrée d’un fichier. <'(file)'
redirige l'entrée d'un fichier appelé (file)
, mais <(file)
est un opérateur différent qui n'est pas un opérateur de redirection.
< (file)
serait <
suivi de (file)
. Dans ce contexte, dans bash
, (file)
n'est pas valide. (...)
peut être valide en tant que jeton unique dans certains contextes tels que:
(sub shell)
func () {
...
}
var=(foo bar)
Mais pas dans
sort < (cmd)
Dans la fish
coquille, c'est différent. In fish
, (...)
est utilisé pour la substitution de commande (l'équivalent de $(...)
in bash
). Et <
est destiné à la redirection d’entrée comme dans les shells Bourne-like.
Alors dans fish
:
sort <(echo file)
serait la même chose que:
sort < (echo file)
C'est:
sort < file
Mais c'est quelque chose de complètement différent de bash
la substitution de processus.
Dans le yash
shell, un autre shell POSIX <(...)
n’est pas destiné à la substitution de processus, mais à la redirection de processus.
Là dedans,
sort <(ls -l)
Court pour:
sort 0<(ls -l)
est un opérateur de redirection. C'est plus ou moins équivalent à:
ls -l | sort
Alors que dans bash
, le <(ls -l)
est étendu au chemin d'un tuyau, il ressemble donc beaucoup à:
ls -l | sort /dev/fd/0
Dans zsh
, (...)
est surchargé en tant qu'opérateur de globbing ( (*.txt|*.png)
développerait les fichiers txt
et les png
fichiers) et en tant que qualificateur de globes ( *(/)
par exemple, les fichiers de répertoires).
Dans zsh
, dans:
sort < (ls -l)
Cela (ls -l)
serait traité comme un qualificatif global. Le l
qualificatif glob est de faire correspondre le nombre de liens et attend un nombre après l
(comme dans la ls -ld ./*(l2)
liste des fichiers avec 2 liens), c'est pourquoi vous obtenez une zsh: number expected
erreur.
sort < (w)
aurait donné une zsh: no matches found: (w)
erreur à la place car (w)
correspond aux fichiers avec un nom vide qui sont en écriture.
sort < (w|cat)
aurait trié le contenu des fichiers w
et / ou du cat
répertoire en cours ...