Existe-t-il un moyen d'exécuter un script shell en faisant écho aux commandes mais sans les exécuter réellement?
Disons que j'ai un script supprimant un fichier dont le nom est stocké dans une variable:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
L'ajout set -v
fera écho aux commandes suivantes avant l'exécution:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Maintenant, je veux voir le flux de ce script sans supprimer réellement le fichier. IOW, je veux empêcher tout effet sur l'environnement externe et le système de fichiers. Est-ce possible?
Je pourrais envelopper toutes les commandes avec une echo
commande, mais c'est fatigant pour un long script.
linux
bash
shell-script
ysap
la source
la source
Réponses:
Il n'y a aucun moyen de parcourir un script pour voir comment il s'exécuterait sans le faire. Dans votre exemple, il n'y a ni
if
instructions ni boucles. Mais dans les vrais scripts, il y a souvent beaucoup d'instructions conditionnelles. La branche qui sera prise dépendra souvent de ce qui s'est passé lorsque le shell a exécuté la commande précédente. S'il n'exécute pas la commande, le shell n'a aucun moyen de savoir quelle sortie il aurait généré ou quel aurait été le code de retour, sur lequel la prochaine branche conditionnelle ou instruction d'affectation pourrait dépendre.Si le fait est que vous souhaitez examiner un script et savoir ce qu'il fait avant de l'exécuter, ce n'est pas une mauvaise idée. Mais en réalité, la meilleure façon de le faire est de simplement parcourir le fichier avec
less
ouvi
ou quelque chose de similaire.Ajoutée
Si vous développez un script et que vous souhaitez le parcourir la première fois, tester la logique mais ne pas réellement endommager si vous avez un bug, la solution que je peux souvent utiliser est de modifier uniquement les déclarations qui pourraient causer des dommages en collant un
echo
sur le devant.Cela fonctionne souvent dans les scripts typiques de la vie réelle, car (a) la génération des listes d'éléments que vous allez parcourir ou la valeur à laquelle vous allez définir une variable peut souvent être générée sans changer le système de fichiers et (b) elle est généralement suffisante pour supposons que si vous exécutiez la commande, elle réussirait.
la source
trap read debug
lequel fera une lecture après chaque ligne exécutée, et vous pouvez ensuite le parcourir lentement avec enter (ceci est utile si vous avez un script vraiment long et que vous voulez tester pour la première fois).Je pense que vous allez devoir faire écho - cependant si vous mettez la commande dans une variable, vous pouvez l'activer et la désactiver. De plus, la commande peut être une fonction aussi sophistiquée que vous le souhaitez.
la source
D=eval
dans la partie live. Mais belle réponse!Vous pouvez suivre le flux en utilisant l'option -x pour bash, mais cela exécuterait toujours les commandes.
Le mieux que vous puissiez faire est de simplement mettre en écho ou de commenter les commandes qui ont des effets externes comme le rm. Au moins, vous n'auriez pas à changer chaque ligne.
la source
Je ne connais pas de méthode particulière pour le dry run, mais nous pouvons utiliser quelques précautions pour comprendre un script inconnu.
bash -n <script>
pour la vérification de la syntaxe . Depuis le manuel de gnu bash https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.
alias rm="rm -i" alias cp="cp -i" alias mv="mv -i"
Pour les éditeurs de flux comme sedsed -i
(-i modifie le fichier en place sans -i il fait un essai à sec pour sed, consultez la page de manuel pour plus de détails) Vous peut copier la commande complète et exécuter. Juste avant la commande réelle, il affichera la sortie à l'écran, puis utilisez la commande pour attendre que l'utilisateur continue. Exemplesed -i <pattern>
Remplacez-le parsed <pattern> read -p "Press any key..." sed -i <pattern>
De plus, il est toujours suggéré de conserver des points de sauvegarde dans votre système afin qu'en cas d'urgence, les données puissent être restaurées.
la source
Faites
set –n
ou ajoutezn
à votreset –v
commande existante . Mais comme cela empêche le shell d'évaluer les commandes, même pasif
ouwhile
, vous risquez de ne pas avoir une vue trop précise du flux opérationnel.la source
Voici une petite construction que j'aime utiliser:
la source
Si vous souhaitez empêcher les modifications de se produire, vous pouvez exécuter le script en tant qu'utilisateur sans privilèges:
Dans votre exemple, cela s'exécutera
FN="filename"
comme d'habitude. Bien qu'il exécute techniquement la commanderm -f ${FN}
également, rien ne se passera si personne n'a les autorisations nécessaires pour supprimer le fichier.Bien sûr, cela entraînera des problèmes avec le workflow conditionnel. Le fait que la
rm
commande ait échoué peut affecter d'autres parties du script.la source