GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist es möglich, die eingebauten Befehle zu Bash zu verfolgen?

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.


Linux
  1. Bash-Bang-Befehle:Ein Must-Know-Trick für die Linux-Befehlszeile

  2. Die Bash‘?

  3. Wie kann ich die Ausgabe eines laufenden Prozesses in einer anderen Bash-Sitzung anzeigen?

  4. Ist es möglich, dass die Bash-Vervollständigung die Alternativen durchläuft?

  5. Einige der Befehle davon ausschließen, im Bash-Verlauf gespeichert zu werden?

Was ist Git Bash? Arbeiten mit Git Bash-Befehlen

So verwenden Sie den Bash-Lesebefehl

Retten Sie erfolgreich den Tag mit Bash-Verlaufsbefehlen

So ändern Sie die Anzahl der im Bash-Verlauf gespeicherten Befehle

Wie verwende ich die Befehle watch und jobs zusammen in Bash?

Ist es möglich, den Inhalt eines laufenden Bash-Skripts aus dem RAM abzurufen?