Bagaimana cara mengatur jebakan dalam fungsi bash?


13

Saya dapat mengatur trapdalam skrip bash tetapi tidak pada fungsi bash.

Misalnya, sourcekode di bawah ini dan jalankan f, sekarang coba Ctrl+ C, itu belum terperangkap!

Bagaimana cara mengatur trapfungsi bash?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 

2
Anda dapat meletakkan sebuah fdi akhir kode Anda, dan menghapus spasi dari f ().
GWF

Jawaban:


7

Itu karena ia mengirimkan SIGINT ke proses di latar depan alih-alih ke bash(yang menjalankan skrip). Jika Anda ingin melakukan ini, buat fungsinya asinkron lalu gunakan wait(yang akan bertindak seperti yang diharapkan dan gunakan perangkap).


Jenis pekerjaan. Tetapi saya menemukan bahwa jika fada dalam pipa echo 123 | f, maka itu tidak menjebak?
Cheng

@Cheng Gunakan subkulit (dan pipa dalam hal ini tidak perlu, cukup gunakan heredoc / herestring). (command | command) &
Chris Down

1

Protip: Kirim proses foreground QUIT dengan Ctrl- \when Ctrl- C, - Z, - Dtidak berfungsi.

Kosongkan jebakan di akhir eksekusi dengan trap - list of signals here

Kegembiraan pada sistem non-produksi: Coba atur jebakan untuk semua sinyal yang masuk akal (mis., Bukan KILL). kill -l(bukan huruf kecil L bukan angka 1 atau pipa |)


0

Saya pikir Anda harus membuat fungsi global

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done

INTdan SIGINTsinonim - tidak ada bedanya.
Chris Down
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.