Mengimplementasikan dry-run dalam skrip bash


15

Bagaimana cara menerapkan opsi dry-run dalam skrip bash?

Saya bisa memikirkan untuk membungkus setiap perintah tunggal dalam if dan mengulang perintah daripada menjalankannya jika skrip dijalankan dengan dry-run.

Cara lain adalah dengan mendefinisikan fungsi dan kemudian melewati setiap panggilan perintah melalui fungsi itu.

Sesuatu seperti:

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

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

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

Apakah ini salah dan ada cara yang lebih baik untuk melakukannya?


Jadi, Anda ingin mencetak apa yang akan dilakukan perintah (termasuk nilai $ VARIABEL) tanpa benar-benar menjalankan perintah. Saya menggunakan sesuatu seperti _run()fungsi Anda , kadang-kadang dengan 'set -xv', tetapi saya akan menyukai cara yang lebih baik.
Stefan Lasiewski

ya, persis seperti itu. Saya bertanya-tanya apakah tidak ada variabel internal yang dapat Anda atur dalam bash sehingga perintah tidak benar-benar dieksekusi, alih-alih melewati mereka melalui fungsi
Andrei Serdeliuc

2
Tidak ada alasan bahwa pertanyaan ini seharusnya ditandai sebagai wiki komunitas.
Dijeda sampai pemberitahuan lebih lanjut.

Bash adalah sebuah shell. Tidak ada alasan untuk melakukan pengeringan. Saya tidak berpikir ada cara yang lebih baik untuk melakukannya daripada yang telah Anda lakukan.
d -_- b

Jawaban:


2

Bukan alternatif, tetapi sepertinya sumber yang bagus untuk menguji dan bekerja dengan program bash yang lebih lama.
Andrei Serdeliuc

Saya memutar kembali pengeditan yang menambahkan jangkar ke bagian tertentu dari halaman yang ditautkan karena titik jawaban saya, seperti yang dinyatakan, adalah untuk membaca diskusi secara keseluruhan daripada menunjuk ke satu bagian khusus bagaimana-untuk. Inti dari halaman yang terhubung umumnya adalah untuk mencoba menghindari menempatkan perintah untuk dieksekusi ke dalam variabel karena ada banyak gotcha.
Dijeda sampai pemberitahuan lebih lanjut.

Akan jauh lebih bermanfaat jika jawaban ini merangkum poin-poin penting dari artikel ini. Satu baris jawaban masih merupakan jawaban yang buruk.
Mark Booth

4

Saya ingin bermain dengan jawaban dari @Dennis Williamson. Inilah yang saya dapatkan:

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

    eval "$@"
}

Yang eval "$@"penting di sini, dan lebih baik daripada hanya melakukan $*. $@mengembalikan semua parameter dan $*mengembalikan semua parameter tanpa spasi / kutipan.

$ 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.