Pipe seulement STDERR à travers un filtre
Est-il possible, en bash, pour tuyau STDERR à travers un filtre avant de l'unifier avec STDOUT? C'est, je veux
STDOUT ────────────────┐
├─────> terminal/file/whatever
STDERR ── [ filter ] ──┘
plutôt que
STDOUT ────┐
├────[ filter ]───> terminal/file/whatever
STDERR ────┘
- Voir aussi Comment pipe stderr, et pas stdout?.
Vous devez vous connecter pour publier un commentaire.
Voici un exemple, qui s'inspire de comment échanger des descripteurs de fichiers en bash . La sortie d'une.est la suivante, sans la "STDXXX:' prefix.
En citant le lien ci-dessus:
3>&2 2>&1 1>&3-
.Un naïf utilisation de processus de substitution semble permettre le filtrage de
stderr
séparément destdout
:Noter que
stderr
sort surstderr
etstdout
surstdout
, où l'on peut voir en enveloppant le tout dans un autre shell interne est exécuté et la redirection vers des fichierso
ete
$
comme une invite de commande. Ensuite, ils écrivent souvent shell exemples comme:$ cat /var/log/syslog | fgrep ...
. Cependant, cette ligne n'est pas la copie pastable en raison de la$
.:;
ressemble à une invite de commandes, mais est essentiellement un shell non-op; de sorte que vous pouvez sélectionner et copier le tout ligne en toute sécurité.TL;DR:
Exemple:
Cela fonctionne dans les deux bash et zsh. Bash est quasiment omniprésent ces jours-ci, cependant, si vous avez vraiment besoin d'un (vraiment gnarly) solution pour POSIX
sh
, puis voir ici.Explication
De loin, la meilleure façon de le faire est de rediriger STDERR via processus de substitution:
De sorte que vous obtenez avec le processus de substitution est un nom de fichier.
Tout comme vous pourriez le faire:
vous pouvez faire
La
>&2
redirigefilter
s'STDOUT en arrière à l'original STDERR.TL;DR: (bash et zsh)
Exemple:
Beaucoup de réponses sur le StackExchange réseau sont de la forme:
Cela a une hypothèse: ce descripteur de fichier 3 n'est pas utilisé pour autre chose.
Au lieu de cela, utilisez un nom de fichier descripteur, et
{ba,z}sh
va allouer de la prochaine descripteur de fichier >= 10:Note le nom de descripteurs de fichier ne sont pas pris en charge par POSIX
sh
.L'autre problème est que la commande ne peut pas être transmis à d'autres commandes, là encore sans permutation de la sortie standard STDOUT et STDERR leurs valeurs d'origine.
Pour permettre la continuation de la tuyauterie dans POSIX
sh
, (et encore en supposant FD 3 n'est-il pas utiliser) il devient compliqué:Donc, compte tenu de l'hypothèse et de gnarly la syntaxe de cette fonction, vous êtes probablement mieux d'utiliser la plus simple
bash
/zsh
syntaxe indiquée dans le TL;DR ci-dessus, et a expliqué ici.Je trouver de l'utilisation de bash processus de substitution plus facile à retenir et à utiliser, car elle reflète l'intention originelle presque mot pour mot. Par exemple:
utilise la première commande sed comme un filtre sur la sortie stderr seule et le deuxième sed de commande pour modifier le joint de sortie.
Noter que l'espace blanc après 2>, est obligatoire pour la commande doit être analysée correctement.
La dernière partie de cette page de l'Advanced Bash Scripting Guide est "redirection seulement stderr d'une pipe".
C'est peut être ce que vous voulez. Si non, une autre partie de la ABSG devrait être en mesure de vous aider, il est excellent.
Jeter un oeil à des canaux nommés:
cat - err
briser les intercalant de stdout et stderr?