Je voudrais simplifier la sortie d'un script en supprimant la sortie des commandes secondaires qui réussissent généralement.
Cependant, leur utilisation -q
masque la sortie lorsqu'ils échouent parfois, donc je n'ai aucun moyen de comprendre l'erreur. En outre, ces commandes enregistrent leur sortie stderr
.
Existe-t-il un moyen de supprimer la sortie d'une commande uniquement si elle réussit ?
Par exemple (mais sans s'y limiter) quelque chose comme ceci:
mycommand | fingerscrossed
Si tout se passe bien, fingerscrossed
capture la sortie et la rejette. Sinon, il se répercute sur la sortie standard ou d'erreur (peu importe).
scripting
error-handling
Matthieu Napoli
la source
la source
moreutils
. Bien pour moi, quand même :)Cela devrait probablement faire l'affaire. Il tamponnera la sortie de chacun
command
dans un fichier temporaire supprimé et siphonnera ensuite sa sortie dans l'un/dev/null
ou l' autre ou dans stderr selon que son état de retour n'est pas nul. Étant donné que le fichier temporaire est supprimé à l'avance, il ne peut être lu par aucun processus, à l' exception/proc/$pid/fd
du shell actuel et de ses enfants sur son descripteur de fichier (sauf les snoopy snoops avec les autorisations appropriées) , et il ne nécessite pas de nettoyage lorsque vous avez terminé .Peut-être une solution plus pratique sur les systèmes Linux:
... qui, dans la plupart des coquilles, fonctionne comme l'autre, sauf que vous pouvez l' appeler comme:
divert some simple-command with args
. Méfiez-vous des commandes à haut rendement dans"$@"
, bien que pourdash
,yash
ou d'autres shells qui font ici des documents avec des tuyaux - je pense qu'il peut être possible dans ces shells de remplir le tampon de pipe (à une valeur par défaut d'environ 128 Ko sur Linux) et ainsi de bloquer . Cela ne devrait pas être un souci pourksh
,mksh
,bash
,zsh
ou le shell Bourne, bien que - tous ceux qui font essentiellement la même chose que je l' ai fait explicitement ci - dessusexec
.la source
Habituellement, en cas d'erreur, la commande génère des messages,
stderr
donc pour votre tâche, vous pouvez simplement supprimerstdout
la source
stderr
(donc cela n'a aucun effet).Pour faire votre propre chronique
la source
Je fais quelque chose comme ça dans mes makefiles:
En adaptant cela à votre situation, vous pourriez faire quelque chose comme ceci:
Ainsi, "if" exécute la commande et redirige la sortie vers mycommand.log. Si vous avez besoin d'attraper stdout vs stdout vs que ce soit, vous devrez peut-être changer la commande de canal '&>' en '>'. Si la commande échoue, capturez le code d'erreur, imprimez le contenu de mycommand.log, supprimez mycommand.log et revenez enfin avec le code d'erreur d'origine.
Sans (exit $ c), vous retourneriez avec le code de sortie qui correspond à ce que la commande 'rm' a renvoyé.
Enfin, si vous voulez une doublure, quelque chose comme ça fonctionnerait.
la source
(...)
comme ça? Parce qu'il ne fait rien d'utile pour vous mais fait apparaître des sous-coquilles supplémentaires.(exit $c)
est en train de se mettre en place$?
, ce que vous ne pouvez pas faire autrement.if ! (mycommand) &>x
est significatif avec la redirection si la commande utilise par exempletime
ou donnerait une erreur de shell.{ ; }
les curlies ... maisexit
c'est un peu délicat, certes.$?
vous pouvez simplement l'utiliser,exit $c
mais oui, dans d'autres cas, il(exit $?)
a de la valeur (même si une fonction shellrret() { return $1; }
serait mieux en général, je dirais). Le sous-shell pour les commandes ne fonctionne toujours pas vraiment comme indiqué par mikeserv.Je viens de trouver cette réponse beaucoup plus simple sur cette autre question :
Fonctionne comme un charme!
la source