Implementieren von Testläufen in Bash-Skripten

15

Wie würde man eine Trockenlaufoption in ein Bash-Skript implementieren?

Ich kann mir vorstellen, jeden einzelnen Befehl in ein if zu packen und den Befehl als Echo auszugeben, anstatt ihn auszuführen, wenn das Skript mit Trockenlauf ausgeführt wird.

Eine andere Möglichkeit wäre, eine Funktion zu definieren und dann jeden Befehlsaufruf durch diese Funktion zu leiten.

Etwas wie:

function _run () {
    if [[ "$DRY_RUN" ]]; then
        echo $@
    else
        $@
    fi
}

`_run mv /tmp/file /tmp/file2`

`DRY_RUN=true _run mv /tmp/file /tmp/file2`

Ist das einfach falsch und gibt es einen viel besseren Weg, es zu tun?

Andrei Serdeliuc
quelle
Sie möchten also drucken, was der Befehl bewirkt (einschließlich der Werte von $ VARIABLES), ohne den Befehl tatsächlich auszuführen. Ich benutze so etwas wie deine _run()Funktion, manchmal mit 'set -xv', aber ich würde einen besseren Weg lieben.
Stefan Lasiewski
ja genau das Ich frage mich, ob es keine interne Variable gibt, die Sie in Bash setzen können, damit Befehle nicht tatsächlich ausgeführt werden, anstatt sie durch eine Funktion zu
leiten
2
Es gibt keinen Grund, warum diese Frage als Community-Wiki markiert sein sollte.
Bis auf weiteres angehalten.
Bash ist eine Muschel. Es gibt keinen Grund für Trockenläufe. Ich glaube nicht, dass es einen besseren Weg gibt, als Sie es bereits getan haben.
d -_- b

Antworten:

2

Siehe BashFAQ / 050: Ich versuche, einen Befehl in eine Variable zu schreiben, aber die komplexen Fälle schlagen immer fehl! für eine Diskussion zu diesem Thema.

Obwohl jetzt entfernt, kann der Abschnitt Hinzufügen von Testfunktionen zu Programmen dennoch nützlich sein.

Dennis Williamson
quelle
Keine Alternative, aber es sieht nach einer hervorragenden Ressource zum Testen und Arbeiten mit längeren Bash-Programmen aus.
Andrei Serdeliuc
Ich habe die Bearbeitung, die einen Anker zu einem bestimmten Teil der verknüpften Seite hinzugefügt hat, zurückgesetzt, da der Punkt meiner Antwort, wie angegeben, darin besteht, die Diskussion als Ganzes zu lesen, anstatt auf einen bestimmten How-to-Teil zu verweisen. Der Sinn der verlinkten Seite besteht im Allgemeinen darin, zu vermeiden, dass Befehle in Variablen ausgeführt werden, da es viele Fallstricke gibt.
Bis auf weiteres angehalten.
Es wäre weitaus nützlicher, wenn diese Antwort die wichtigsten Punkte dieses Artikels zusammenfassen würde. Einzeilige Antworten sind immer noch schlechte Antworten.
Mark Booth
4

Ich wollte mit der Antwort von @Dennis Williamson spielen. Folgendes habe ich bekommen:

Run () {
    if [ "$TEST" ]; then
        echo "$*"
        return 0
    fi

    eval "$@"
}

Das eval "$@"ist hier wichtig und besser als einfach zu tun $*. $@Gibt alle Parameter und $*alle Parameter ohne Leerzeichen / Anführungszeichen zurück.

$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file1
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file2
Stefan Lasiewski
quelle