Implementierung eines Trockenlaufs in Bash-Skripten

Implementierung eines Trockenlaufs in Bash-Skripten

Wie würde man eine Probelaufoption in einem Bash-Skript implementieren?

Ich kann mir vorstellen, entweder jeden einzelnen Befehl in ein „if“ einzuschließen und den Befehl auszugeben, anstatt ihn auszuführen, wenn das Skript mit einem 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?

Antwort1

SehenBashFAQ/050: Ich versuche, einen Befehl in eine Variable einzufügen, aber die komplexen Fälle schlagen immer fehl!für eine Diskussion dieses Themas.

Obwohl der Abschnitt inzwischen entfernt wurde,So fügen Sie einem Programm Testfunktionen hinzukann immer noch nützlich sein.

Antwort2

Ich wollte mit der Antwort von @Dennis Williamson spielen. Hier ist, was ich bekommen habe:

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

    eval "$@"
}

Das eval "$@"ist hier wichtig und besser, als einfach auszuführen $*. $@Gibt alle Parameter zurück und $*gibt 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

verwandte Informationen