“Arayan” komutu nedir?


13

Üstte Openbox çalışan Ubuntu 10.10 kullanıyorum. Bugün bir komut fark ettim caller, ancak bir man sayfası yok, herhangi bir girişe (veya --help) cevap vermiyor ve nerede bulamıyor.

Bunun ne olduğu hakkında bir fikriniz var mı?

Yanıtlar:


17

Çalıştırmak

type caller

ve bunun yerleşik bir kabuk olduğunu göreceksiniz. Koşu

help caller

bash'ın manuel sayfasında da bildirilen işlevini gösterecektir. kısaca

Return the context of the current subroutine call.


3
Muhteşem. Sadece bu komutun ne yaptığını öğrenmekle kalmadım, aynı zamanda "tip" komutunu da öğrendim. Teşekkürler :)

2
TIL bash yerleşik bir helpkomuta sahip
nibot

Bu sadece cevabı değil süreci de öğretmek için iki kez vekalet edebilirim.
dmckee --- eski moderatör yavru kedi

@Muu, @nibot, @dmckee: ayrıca type type, type help, help typeve help help:) çalıştırmak için eğlenceli olabilir
enzotib

11

callerBash sürüm 3.0 çıktı (POSIX belirttiği) yerleşik komutu olup, herhangi bir aktif altyordamın bağlamını döndürür. Daha fazla okuma için Bash-Builtins'e bakınız .

Sözdizimi:

caller [FRAMENUMBER]

Eğer kare sayısı , negatif olmayan bir tamsayı olarak verilir, bu akım çalıştırma çağrı yığını bu pozisyonda karşılık gelen hat numarasını, alt program adı ve kaynak dosyasını gösterir.

Herhangi bir parametre olmadan arayan , geçerli altyordam çağrısının satır numarasını ve kaynak dosya adını görüntüler.

Bash Hackers Wiki'de aşağıdaki Basit yığın izlemesini kontrol edin :

#!/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

Çıktı:

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

dieOrta derecede karmaşık komut dosyalarındaki hataları izlemek için iyi bir işlev örneği :

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

Daha karmaşık hata ayıklama için, Bash genişletilmiş hata ayıklama özellikleri ve arayandan daha fazla ayrıntı veren bir dizi özel parametre mevcuttur (örn. BASH_ARG{C,V}). Bashdb gibi araçlar , Bash'in daha gelişmiş hata ayıklama özelliklerinden bazılarının kullanılmasına yardımcı olabilir.


2

Bu bir kabuk yerleşik komutudur: man bash(Daha sonra 'arayan' araması)
Yığın izini yazdırmak için kullanılabilir.


Yine de bana 'tip' öğrettiğinden enzotibin cevabını seçtim. Çok teşekkürler olsa :)

0

readÇıktının callernasıl biçimlendirileceğini kontrol etmek için değişkenlerin çıktısını alabileceğinizi unutmayın :

stacktrace() {
  local frame=0 LINE SUB FILE
  while read LINE SUB FILE < <(caller "$frame"); do
    echo "${SUB} @ ${FILE}:${LINE}"
    ((frame++))
  done
}

Demo:

$ cat /tmp/caller.sh 
#!/bin/bash

stacktrace() {
  local frame=0 LINE SUB FILE
  while read LINE SUB FILE < <(caller "$frame"); do
    printf '  %s @ %s:%s' "${SUB}" "${FILE}" "${LINE}"
    ((frame++))
  done
}

die() {
  echo "$*"
  stacktrace
  exit 1
}

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

f3

$ bash /tmp/caller.sh
*** an error occured ***
  die @ /tmp/caller.sh:13
  f1 @ /tmp/caller.sh:17
  f2 @ /tmp/caller.sh:18
  f3 @ /tmp/caller.sh:19
  main @ /tmp/caller.sh:21
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.