Implementazione di esecuzione a secco negli script bash


15

Come implementare un'opzione dry-run in uno script bash?

Posso pensare a racchiudere ogni singolo comando in un if e riecheggiare il comando invece di eseguirlo se lo script è in esecuzione con dry-run.

Un altro modo sarebbe quello di definire una funzione e quindi passare ogni chiamata di comando attraverso quella funzione.

Qualcosa di simile a:

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

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

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

È solo sbagliato e c'è un modo molto migliore di farlo?


Quindi, si desidera stampare ciò che farà il comando (inclusi i valori di $ VARIABLES) senza eseguire effettivamente il comando. Uso qualcosa come la tua _run()funzione, a volte con 'set -xv', ma mi piacerebbe un modo migliore.
Stefan Lasiewski,

sì, esattamente quello. Mi chiedo se non ci sia una variabile interna che puoi impostare in bash, quindi i comandi non vengono effettivamente eseguiti, invece di passarli attraverso una funzione
Andrei Serdeliuc

2
Non c'è motivo per cui questa domanda avrebbe dovuto essere contrassegnata come wiki della community.
In pausa fino a ulteriore avviso.

Bash è una shell. Non vi è alcun motivo per farlo eseguire corse a secco. Non penso che ci sia un modo migliore di farlo di quello che hai già fatto.
d -_- b

Risposte:


2

Non è un'alternativa, ma sembra un'ottima risorsa per testare e lavorare con programmi bash più lunghi.
Andrei Serdeliuc,

Ho ripristinato la modifica che ha aggiunto un'ancora a una particolare parte della pagina collegata poiché il punto della mia risposta, come detto, è leggere la discussione nel suo insieme piuttosto che indicare una parte specifica del come fare. Lo scopo della pagina collegata è generalmente quello di cercare di evitare di inserire comandi da eseguire in variabili poiché ci sono molti gotcha.
In pausa fino a ulteriore avviso.

Sarebbe molto più utile se questa risposta riassumesse i punti salienti di questo articolo. Le risposte a una riga sono ancora risposte scarse.
Mark Booth,

4

Volevo giocare con la risposta di @Dennis Williamson. Ecco cosa ho ottenuto:

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

    eval "$@"
}

Il eval "$@"è importante, ed è meglio allora semplicemente facendo $*. $@restituisce tutti i parametri e $*restituisce tutti i parametri senza spazi bianchi / virgolette.

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.