Ma question concerne la priorité de redirection est bash. Supposons que vous ayez une commande:
cmd1 < cmd2 > cmd3
Cela se traduirait-il par:
(cmd1 < cmd2) > cmd3
Ou
cmd1 < (cmd2 > cmd3)
la source
Ma question concerne la priorité de redirection est bash. Supposons que vous ayez une commande:
cmd1 < cmd2 > cmd3
Cela se traduirait-il par:
(cmd1 < cmd2) > cmd3
Ou
cmd1 < (cmd2 > cmd3)
La norme POSIX spécifie que la redirection du shell se fait de gauche à droite; autrement dit, l'ordre est important:
La construction
2>&1
est souvent utilisée pour rediriger l'erreur standard vers le même fichier que la sortie standard. Étant donné que les redirections ont lieu du début à la fin, l'ordre des redirections est significatif. Par exemple:ls > foo 2>&1
dirige la sortie standard et l'erreur standard vers le fichier
foo
. Toutefois:ls 2>&1 > foo
dirige uniquement la sortie standard vers le fichier
foo
car l'erreur standard a été dupliquée en tant que sortie standard avant que la sortie standard ne soit dirigée vers le fichierfoo
.
bash
fonctionne conformément à cette partie de la norme:
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
Quant à la tuyauterie:
Étant donné que l'affectation de pipeline d'entrée standard ou de sortie standard ou les deux a lieu avant la redirection, elle peut être modifiée par redirection. Par exemple:
$ command1 2>&1 | command2
envoie à la fois la sortie standard et l'erreur standard de
command1
à l'entrée standard decommand2
.
ls > foo 2>&1
signifier rediriger stdout vers foo puis rediriger stderr vers stdout. Cela ne devrait donc pas fonctionner. De même, la deuxième commande devrait fonctionner. Qu'est-ce que j'oublie ici?bash
est généralement compatible POSIX, sauf dans les situations décrites ici , où lebash
comportement par défaut diffère. Pour rendrebash
plus conforme, vous pouvez utiliser l'--posix
option.ls > foo 2>&1
fonctionne comme ceci: d'abord, la sortie standard est redirigée versfoo
, puis, l'erreur standard est redirigée vers la sortie standard, qui est maintenant le fichierfoo
. Le deuxième exemplels 2>&1 > foo
,, fonctionne comme ceci: l'erreur standard est redirigée vers la sortie standard avant que la sortie standard ne soit redirigéefoo
, donc l'erreur standard est répercutée localement au lieu d'être dirigée vers le fichier.ls 2>&1 >foo
peut-être que vous pouvez penser comme ça. stderr de 'ls' est redirigé vers stdout. Cela arrivera! Il ira là où stdout est actuellement assigné pour aller, indépendamment de toute autre directive relative à stdout .. (parce que c'est sa première / première directive ) .. Ensuite vient une autre directive qui dit que stdout ira à "foo", et il le fait ... Rappelez-vous: stderr n'est pas transmuté en devenant réellement stdout .. Il va juste là où stdout a été assigné au moment de la directive. (par exemple, le terminal)Je suppose que non plus. Une paire de parenthèses signifie un sous-shell. Mais dans ce cas, aucun sous-shell ne sera démarré à cause de la redirection. Bash alimente simplement
cmd2
stdin et stdoutcmd3
.Je pense, tu veux dire quelque chose comme
cmd1 | cmd2 | cmd3
? Parce que vos fichierscmd2
etcmd3
sont généralement normaux au lieu de "cmds".la source