Bagaimana mengeksekusi skrip bash baris demi baris?

93

Jika saya memasukkan opsi bash -x , itu akan menampilkan semua baris. Tetapi skrip akan dieksekusi secara normal.

Bagaimana saya bisa mengeksekusi baris demi baris? Maka saya dapat melihat apakah itu melakukan hal yang benar, atau saya membatalkan dan memperbaiki bug. Efek yang sama ditempatkan readdi setiap baris.

Rodrigo
sumber

Jawaban:

126

Anda tidak perlu membaca di setiap baris, cukup tambahkan jebakan seperti berikut ini ke dalam skrip bash Anda, itu memiliki efek yang Anda inginkan, mis.

#!/usr/bin/env bash
set -x
trap read debug

< YOUR CODE HERE >

Berfungsi, cukup uji dengan bash v4.2.8 dan v3.2.25.


VERSI PENINGKATAN

Jika skrip Anda membaca konten dari file, daftar di atas tidak akan berfungsi. Solusi dapat terlihat seperti contoh berikut.

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

< YOUR CODE HERE >

Untuk menghentikan skrip, Anda harus membunuhnya dari shell lain dalam kasus ini.


ALTERNATIF 1

Jika Anda hanya ingin menunggu beberapa detik sebelum melanjutkan ke perintah berikutnya dalam skrip Anda, contoh berikut dapat berfungsi untuk Anda.

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG

< YOUR CODE HERE >

Saya menambahkan set + x dan set -x dalam perintah trap untuk membuat keluaran lebih mudah dibaca.

organik-mashup
sumber
1
Lalu bagaimana Anda melangkah ke baris berikutnya (menjalankan perintah selanjutnya)?
David Doria
2
Itu menjebak pembacaan pada setiap perintah. Satu-satunya hal yang perlu Anda lakukan adalah menekan kembali untuk mendapatkan perintah berikutnya
organic-mashup
1
jika Anda memiliki baris perintah seperti ini "while read line; do echo $ line; done <somefile" metode itu tidak berfungsi karena "trap read DEBUG" membaca baris dari somefile
mug896
3
Bagaimana Anda membuatnya berhenti? Setelah saya melangkah melalui skrip sampai akhir, shell bertindak seperti skrip masih berjalan.
slashdottir
1
Ubah ke trap 'read -u1' debuguntuk menimpa masalah pengalihan baca file.
user3132194
23

Mungkin BASH Debugger adalah sesuatu untuk Anda.


sumber
3
Ini benar-benar solusi terbaik. Ini memungkinkan melihat garis sebelum dijalankan (dan banyak lagi). Pada sebagian besar sistem, ini dapat diinstal dengan apt-get install bashdb. Kemudian Anda hanya perlu berlari bashdb your_command.sh, mengetik step, lalu tekan carriage return setelah itu.
studgeek
1
@studgeek tidak tersedia di Redhat / CentOS dll. jadi saya tidak akan menyebutnya "kebanyakan sistem".
Sajuuk
@Sajuuk, ini mungkin tidak dikemas , tapi benar-benar tersedia .
Charles Duffy
macOS:brew install bashdb
boweeb
@CharlesDuffy: itu juga tidak ada di repositori Ubuntu default.
Dan Dascalescu
2

Jika skrip bash Anda benar-benar sekumpulan perintah satu per satu yang ingin Anda jalankan satu per satu, Anda dapat melakukan sesuatu seperti ini, yang menjalankan setiap perintah satu per satu saat Anda menambahkan variabel LN, sesuai dengan nomor baris yang ingin Anda jalankan . Ini memungkinkan Anda untuk menjalankan kembali perintah terakhir dengan sangat mudah, lalu Anda hanya menambah variabel untuk melanjutkan ke perintah berikutnya.

Dengan asumsi perintah Anda ada dalam file "it.sh", jalankan perintah berikut, satu per satu.

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd
Brad Parks
sumber
1

Lihat bash-stepping-xtrace .

Ini memungkinkan melangkah xtrace.

mug896
sumber
1

xargs: dapat memfilter garis

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 Perlakukan sebagai input mentah (tidak ada pelarian)
  • -l Pisahkan setiap baris (Tidak secara default untuk pertunjukan)
  • -d \\ n Pemisah garis
Tinmarino
sumber