Inspiriert von dieser Frage mit dem Titel:Wann werden die integrierten Befehle in den Speicher geladen, versuchte ich beim Versuch, dies zu beantworten, den folgenden Befehl und war etwas überrascht, dass ich ihn nicht ausführen konnte:
$ strace cd $HOME
Gibt es eine Methode, die ich verwenden kann, um strace für die eingebauten Befehle in Bash auszuführen?
Akzeptierte Antwort:
Wenn Sie darüber nachdenken, wie strace
funktioniert, dann macht es absolut Sinn, dass keines der Builtins zu Bash rückverfolgbar wäre. strace
kann nur tatsächliche ausführbare Dateien nachverfolgen, während dies bei den eingebauten Dateien nicht der Fall ist.
Zum Beispiel meine cd
Befehl:
$ type cd
cd is a function
cd ()
{
builtin cd "[email protected]";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Trick zum Aufzeichnen von CDs?
Ich bin auf diese Technik gestoßen, bei der Sie strace
aufrufen können auf der eigentlichen bash
verarbeiten und dabei indirekt cd
nachverfolgen auf diese Weise.
Beispiel
$ stty -echo
$ cat | strace bash > /dev/null
Was dazu führt, dass ich die bash
straceen kann gehen Sie wie folgt vor:
....
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", X_OK) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=940312, ...}) = 0
geteuid() = 500
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", R_OK) = 0
getpgrp() = 32438
rt_sigaction(SIGCHLD, {0x43e360, [], SA_RESTORER, 0x34e7233140}, {SIG_DFL, [], SA_RESTORER, 0x34e7233140}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=1024, rlim_max=62265}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fcntl(0, F_GETFL) = 0 (flags O_RDONLY)
fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
Dies ist die Bash-Eingabeaufforderung, wo sie dort sitzt und auf eine Eingabe wartet. Geben wir ihm also den Befehl cd ..
:
read(0, "c", 1) = 1
read(0, "d", 1) = 1
read(0, " ", 1) = 1
read(0, ".", 1) = 1
read(0, ".", 1) = 1
read(0, "n", 1) = 1
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/saml", {st_mode=S_IFDIR|0700, st_size=32768, ...}) = 0
stat("/home/saml/tst", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/saml/tst") = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
Aus der obigen Ausgabe können Sie sehen, wo ich den Befehl eingegeben habe, cd ..
und drücken Sie die Eingabetaste, (n
). Von dort aus können Sie sehen, dass die stat()
Funktion aufgerufen wurde, und dass Bash danach an einem anderen read(0..
sitzt Eingabeaufforderung, warten auf einen weiteren Befehl.