Comment faire pour activer ou désactiver plusieurs “écho des déclarations” en bash ecript
J'ai des scripts bash où j'ai une echo avant chaque commande montrant ce qui se passe.
Mais j'ai besoin de disbale écho lors de la définition que cron job, puis activer à nouveau, si faire des tests.
je trouve qu'il est très difficile d'aller à chaque ligne, puis sur ajouter/supprimer un commentaire
il n'y a rien dont je puisse les intégrer à haut quelque chose comme
enable echo or disable echo
de sorte que je n'ai pas à perdre de temps
OriginalL'auteur Mahakaal | 2011-05-12
Vous devez vous connecter pour publier un commentaire.
L'absolu le plus simple serait d'insérer la ligne suivante après la hashbang ligne:
Quand vous voulez ré-activer, soit de supprimer la ligne ou en commentaire:
Si vous ne l'utilisez pas
echo
maisprintf
, même stratégie, à savoir:Si vous absolument besoin de fait echo/printf quelque chose, ajouter le
builtin
énoncé, par exemple:Cela signifie que vous pouvez le faire à une condition de sortie, par exemple:
Définir la
SOME_KIND_OF_FLAG
variable à quelque chose de non-nulle, et remplacésecho
fonction se comporte comme normalecho
.EDIT: une autre alternative serait d'utiliser
echo
pour instrumentant (débogage), etprintf
pour les sorties (par exemple, pour les tubes fins). De cette façon, pas besoin deFLAG
. Il suffit de désactiver/activer leecho() { :; }
ligne en fonction de si vous voulez l'instrument ou non, respectivement.Activer/Désactiver via l'interface CLI Paramètre
Mettre ces lignes juste après la hashbang ligne:
Maintenant, en invoquant le script comme ceci:
script.sh debug
va tourner sur l'instrumentation. Et parce qu'il y a de lashift
de commande, vous pouvez toujours nourrir les paramètres. E. g.:script.sh param1 param2
script.sh debug param1 param2
Ci-dessus peut être simplifiée:
si vous besoin la instrumentant drapeau (par exemple, pour enregistrer la sortie d'une commande vers un fichier temp seulement si le débogage), utiliser un
else
-bloc:RAPPELEZ-vous: en mode débogage non, tous
echo
commandes sont désactivées; vous devez utiliserbuiltin echo
ouprintf
. Je vous recommande le dernier.echo "Backing up ...."$FOLDER/$DATE
. fait que la ligne a n'importe quel problèmeJe viens de tester, et je n'ai eu aucune erreur. Mais là encore, vous devriez mettre
$FOLDER/$DATE
à l'intérieur les guillemets, c'est à dire :"Backing up ... $FOLDER/$DATE"
j'ai essayé d'ajouter cette ligne au-dessous de hashbang , et puis je l'ai testé sans écho déclaration , j'obtiens toujours l'erreur qu'il dit
Unexpected end of file
omigosh, je viens de réaliser: Il doit être
:;
au lieu de simplement:
. J'ai testé le "conditionnel de sortie". Je vais corriger ma réponse. Désolé pour la surveillance.wow qui a parfaitement bien fonctionné , c'était la réponse que je cherchais , tous les autres étaient une sorte de hacks, mais c'était préfet. aussi est-il possible que je peux passer quelque chose sur la ligne de commande, puis il affiche echo othwise pas comme
/bin/sh abc.sh yes
et puis il affiche les echosOriginalL'auteur pepoluan
Plusieurs choses:
N'utilisez pas d'écho à tous
Au lieu d'utiliser
set -xv
pour définir le mode débogage qui se fera l'écho de chaque commande. Vous pouvez définirPS4
souhaité à l'invite: par exemplePS4='$LINENO: '
permet d'imprimer le numéro de la ligne sur chaque ligne. En BASH, je crois que c'est la même chose. Ensuite, vous n'avez pas à nettoyer votre script. Pour couper, utilisezset +xv
.Exemple:
foo=7
bar=7
PS4='$LINENO:'
set-xv #Commencer le débogage
if [ $foo = $bar ]
alors
echo "foo n'est certainement égale bar"
fi
Résultats:
$ myprog.sh
if [ $foo = $bar ]
alors
echo "foo n'est certainement égale bar"
fi
Utiliser une fonction
Définir une fonction au lieu d'utiliser echo:
Exemple:
fonction myecho {
if [ ! -z "$DEBUG" ]
alors
echo "$*"
fi
}
DEBUG="TRUE"
mon echo "permet d'imprimer cette ligne"
unset DEBUG
myecho "Mais ne sera pas imprimer cette ligne"
Utiliser le nop de commande
Les deux-points (:) est l'avis d'intention de commande de BASH. Il ne fait rien. Utiliser une variable d'environnement et de définir comme echo ou :. Quand il est réglé à un colon, rien ne se passe. Lorsque la valeur
echo
, la ligne de tirages.Exemple:
echo=":"
$echo "Cette ligne ne sont pas imprimer"
echo="echo"
$echo "Mais cette ligne."
OriginalL'auteur David W.
Bâtiment sur Matthieu réponse, comment au sujet de quelque chose comme ceci:
et ensuite utiliser
$myEcho
au lieu deecho
dans votre script?Ce n'est pas valable bash syntaxe. Vous devez avoir aucune espaces autour de la
=
signes (si vous le faites, il sera interprété comme de l'exécution de la commandemyEcho
avec=
que son premier argument), et utiliser un point-virgule ou un saut de ligne à la place de la virgule entre leif
etthen
.-1 pour les invalides bash syntaxe (c'est à dire, ce que @Brian a commenté).
OriginalL'auteur QuantumMechanic
Que vous pouvez faire mieux. Si vous configurez votre crontab comme détaillé dans une autre réponse, vous pouvez ensuite vérifier si vous êtes en cours d'exécution dans le cron et imprimer uniquement si vous n'êtes pas. De cette façon, vous n'avez pas besoin de modifier votre script à tous entre les différentes pistes.
Vous devriez alors être en mesure d'utiliser quelque chose comme ceci (n'a probablement pas assez de travail, je ne suis pas compétent dans
bash
):if
comme ça.C'est une fois hors de l'emploi, alors c'est fait. Beats modification de votre script à chaque fois que vous l'exécutez, puisqu'il est déjà en commentant chaque echo, de toute façon.
OriginalL'auteur Matthew Scharley
Essayer
set -v
en haut de l'écho de chaque commande. Pour arrêter l'écho de le changer pourset +v
.OriginalL'auteur grok12
Si vous êtes en cours d'exécution dans cron, pourquoi ne pas simplement faire un dump de la sortie? Changer votre entrée crontab de sorte qu'il a
> /dev/null
à la fin de la commande, et toutes les sorties seront ignorés.OriginalL'auteur Daenyth
Ne sais pas si je m'ennuie ci-dessous la solution d'utiliser une variable (par exemple, debug) au début du script bash.
Une fois le debug=true, toute conditionnel si activer ou de désactiver plusieurs “echo états” dans le script bash.
OriginalL'auteur Nasri Najib