Ü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ı?
Ü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:
Ç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.
help
komuta sahip
type type
, type help
, help type
ve help help
:) çalıştırmak için eğlenceli olabilir
caller
Bash 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 ***
die
Orta 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.
read
Çıktının caller
nası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