Masquer la sortie d'une commande shell implique généralement de rediriger stderr et stdout. Existe-t-il une fonction ou une commande intégrée qui, par défaut, masque la sortie, mais en cas d'erreur, vide toute la sortie accumulée? Je voudrais l'exécuter comme un wrapper pour les ssh
commandes à distance . Maintenant, je les utilise en redirection, mais je ne sais pas ce qui les a fait échouer, et ils sont tout simplement trop verbeux.
EDIT: Au final, j'ai créé le modèle suivant basé sur la réponse de @Belmin que j'ai légèrement modifié pour accumuler toutes les commandes précédentes du script, utiliser l'identifiant de processus actuel, supprimer automatiquement le journal et ajouter une erreur rouge d'erreur message en cas de problème. Dans ce modèle, les silent
wrappers initiaux réussiront, puis échouera la troisième commande car le répertoire existe déjà:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
quelque chose comme:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Réponses:
Je configurerais une fonction bash comme ceci:
Ensuite, vous pouvez simplement exécuter la commande:
la source
/etc/passswd
un autre fichier critique et ferait écraser le contenu.$* > /tmp/surpress.out 2>&1
Cela capture vraiment le stderr.$*
n'est pas le meilleur pour gérer les entrées arbitraires. Surtout quand il contient des espaces ou des drapeaux. Le plus portable est${1+"$@"}
selon stackoverflow.com/questions/743454/…Il devrait être assez facile d'écrire un script à cet effet.
Quelque chose comme ce script complètement non testé.
D'un autre côté, pour les commandes que j'exécute dans le cadre d'un script, je veux généralement quelque chose de mieux que d'imprimer simplement toutes les sorties. Je limite souvent ce que je vois à l'inconnu. Voici un script que j'ai adapté de quelque chose que j'ai lu il y a plus de dix ans.
la source
Je ne pense pas qu'il existe une façon propre de le faire, la seule chose à laquelle je peux penser est
La mise en œuvre de ceci pourrait cependant être un projet intéressant mais peut-être au-delà des questions / réponses.
la source
aller court avec quelque chose comme
tehcommand &>/tmp/$$ || cat /tmp/$$
dépend de la facilité d'utilisation / de la frappe que vous voulez / besoin. (par exemple en l'utilisant comme pipe ou en passant la commande par argument)
Le script court @zoredache est fondamentalement un proto-wrapper pour cela, ce qui donnerait plus de robustesse, gérerait la concurrence, etc.
la source
Essayez donc:
la source
out="$(command args...)" || echo "$out"