Apa perintah "penelepon"?

12

Saya menjalankan Ubuntu 10.10 dengan openbox berjalan di atas. Saya perhatikan hari ini perintah yang disebut caller, namun tidak ada halaman manual, itu tidak menanggapi input (atau --help) dan di mana tidak menemukannya.

Tahu apa kira-kira ini?

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

16

Lari

type caller

dan Anda akan melihat itu adalah built-in shell. Lari

help caller

akan menunjukkan fungsinya, dilaporkan juga di halaman manual bash. Secara singkat

Return the context of the current subroutine call.

enzotib
sumber
3
Luar biasa. Saya tidak hanya belajar apa yang dilakukan perintah itu, saya juga belajar perintah "ketik". Terima kasih :)
2
TIL bash memiliki helpperintah
bawaan
Yang saya bisa pilih dua kali untuk mengajar tidak hanya jawabannya tetapi juga prosesnya.
dmckee --- ex-moderator kitten
@Muu, @nibot, @dmckee: juga type type, type help, help typedan help helpbisa menyenangkan untuk menjalankan :)
enzotib
10

Perintah calleris builtin (tidak ditentukan oleh POSIX) muncul di Bash versi 3.0 dan mengembalikan konteks semua panggilan subrutin yang aktif. Lihat: Bash-Builtins untuk membaca lebih lanjut.

Sintaksis:

caller [FRAMENUMBER]

Jika nomor bingkai diberikan sebagai bilangan bulat non-negatif, itu akan menampilkan nomor baris, nama subrutin, dan file sumber yang sesuai dengan posisi itu dalam tumpukan panggilan eksekusi saat ini.

Tanpa parameter apa pun, pemanggil menampilkan nomor baris dan nama file sumber panggilan subrutin saat ini.

Periksa jejak tumpukan sederhana berikut di Bash Hackers Wiki :

#!/bin/bash

die() {
  local frame=0
  while caller $frame; do
    ((frame++));
  done
  echo "$*"
  exit 1
}

f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }

f3

Keluaran:

12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***

Berikut adalah contoh diefungsi yang layak untuk melacak kesalahan dalam skrip yang cukup kompleks:

{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'

Untuk debugging yang lebih canggih, fitur debugging Bash diperpanjang tersedia dan sejumlah parameter khusus yang memberikan lebih detail daripada pemanggil (mis BASH_ARG{C,V}.). Alat-alat seperti Bashdb dapat membantu dalam menggunakan beberapa fitur debug Bash yang lebih canggih.

kenorb
sumber
2

Ini adalah perintah shell builtin: man bash(Kemudian cari 'pemanggil')
Ini dapat digunakan untuk mencetak jejak tumpukan.

tuxce
sumber
Terima kasih meskipun saya memilih jawaban enzotib karena dia juga mengajari saya 'mengetik'. Terima kasih banyak :)