Apakah ada cara untuk menjalankan skrip shell dengan menggemakan perintah tetapi tanpa menjalankannya?
Katakanlah saya memiliki skrip yang menghapus file yang namanya disimpan dalam variabel:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
Menambahkan set -v
akan mengulangi perintah berikut sebelum eksekusi:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Sekarang, saya ingin melihat alur skrip ini tanpa menghapus file. TKI, saya ingin mencegah efek apa pun pada lingkungan eksternal dan sistem file. Apakah ini mungkin?
Saya bisa membungkus semua perintah dengan echo
perintah, tetapi itu melelahkan untuk skrip yang panjang.
Jawaban:
Tidak ada cara untuk melangkah melalui skrip untuk melihat bagaimana itu akan dijalankan tanpa benar-benar melakukan itu. Dalam contoh Anda, tidak ada
if
pernyataan atau loop. Namun dalam naskah asli, seringkali ada banyak pernyataan kondisional. Cabang mana yang akan diambil akan sering bergantung pada apa yang terjadi ketika shell menjalankan perintah sebelumnya. Jika tidak menjalankan perintah, shell tidak mungkin mengetahui output apa yang akan dihasilkannya atau apa kode pengembaliannya, yang bergantung pada cabang kondisional atau pernyataan tugas berikutnya.Jika intinya adalah Anda ingin meneliti skrip dan tahu apa fungsinya sebelum Anda menjalankannya, itu bukan ide yang buruk. Namun secara realistis, cara terbaik untuk melakukannya adalah dengan hanya meramban file dengan
less
atauvi
atau yang serupa.Ditambahkan
Jika Anda sedang mengembangkan skrip dan Anda ingin melewatinya pertama kali, menguji logika tetapi tidak benar-benar melakukan kerusakan jika Anda memiliki bug, solusi yang sering saya dapat gunakan adalah dengan memodifikasi saja pernyataan yang bisa menyebabkan kerusakan dengan menempelkan
echo
ke depan.Ini sering bekerja dalam skrip kehidupan nyata yang khas karena (a) menghasilkan daftar item yang akan Anda iterate atau nilai yang akan Anda setel variabel sering dapat dihasilkan tanpa mengubah sistem file dan (b) biasanya cukup untuk berasumsi bahwa jika Anda menjalankan perintah, itu akan berhasil.
sumber
trap read debug
yang akan melakukan pembacaan setelah setiap baris dieksekusi, dan Anda kemudian dapat melangkah secara perlahan dengan enter (ini berguna jika Anda memiliki skrip yang sangat panjang dan ingin menguji untuk pertama kali).Saya pikir Anda harus mengulangi - namun jika Anda memasukkan perintah ke dalam variabel, Anda dapat menghidupkan dan mematikannya. Juga, perintah itu bisa berfungsi dan secanggih yang Anda inginkan.
sumber
D=eval
di bagian live. Tapi jawaban yang bagus!Anda melacak aliran menggunakan opsi -x untuk bash, tetapi ini masih akan menjalankan perintah.
Yang terbaik yang bisa Anda lakukan adalah hanya menempatkan gema atau komentar perintah yang memiliki efek eksternal seperti rm. Setidaknya Anda tidak perlu mengubah setiap baris.
sumber
Saya tidak tahu metode khusus untuk dry run, tetapi kita bisa menggunakan beberapa tindakan pencegahan untuk memahami skrip yang tidak dikenal.
bash -n <script>
untuk pemeriksaan sintaks . Dari gnu bash manual 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"
Untuk stream editor seperti sedsed -i
(-i memodifikasi file di tempat tanpa -i itu menjalankan kering untuk sed, periksa halaman manual untuk rincian) Anda dapat menyalin perintah lengkap dan menjalankan. Tepat sebelum perintah aktual itu akan menampilkan output di layar kemudian gunakan perintah untuk menunggu input pengguna untuk melanjutkan. Contohsed -i <pattern>
Ganti dengansed <pattern> read -p "Press any key..." sed -i <pattern>
Juga selalu disarankan untuk menyimpan titik cadangan di sistem Anda agar data darurat dapat dipulihkan.
sumber
Lakukan
set –n
, atau tambahkan perintahn
Anda yang adaset –v
. Tetapi karena ini menyebabkan shell tidak mengevaluasi perintah apa pun, bahkan tidakif
atauwhile
, Anda mungkin tidak mendapatkan pandangan yang terlalu baik dari aliran operasional.sumber
Berikut ini sedikit konstruksi yang ingin saya gunakan:
sumber
Jika Anda ingin agar modifikasi tidak terjadi, Anda dapat menjalankan skrip sebagai pengguna tanpa hak istimewa:
Dalam contoh Anda, ini akan dijalankan
FN="filename"
seperti biasa. Meskipun secara teknis mengeksekusi perintahrm -f ${FN}
juga, tidak ada yang akan terjadi jika tidak ada yang tidak memiliki izin yang diperlukan untuk menghapus file.Tentu saja, ini akan menyebabkan masalah dengan alur kerja bersyarat. Fakta bahwa
rm
perintah gagal dapat mempengaruhi bagian skrip selanjutnya.sumber