GNU/Linux >> Znalost Linux >  >> Linux

Je možné vysledovat Builtin Commands To Bash?

Inspirován touto otázkou s názvem:Kdy jsou vestavěné příkazy načteny do paměti, při pokusu o odpověď jsem zkusil následující příkaz a byl jsem trochu překvapen, že jej nemohu spustit:

$ strace cd $HOME

Existuje metoda, kterou mohu použít ke spuštění strace pro vestavěné příkazy do Bash?

Přijatá odpověď:

Pokud přemýšlíte o tom, jak strace funguje, pak dává naprosto smysl, že žádný z vestavěných prvků pro Bash nebude sledovatelný. strace dokáže sledovat pouze skutečné spustitelné soubory, zatímco vestavěné soubory nikoli.

Například moje cd příkaz:

$ type cd
cd is a function
cd () 
{ 
    builtin cd "[email protected]";
    local result=$?;
    __rvm_project_rvmrc;
    __rvm_after_cd;
    return $result
}

Trik pro sledování CD?

Narazil jsem na tuto techniku, kde jste mohli vyvolat strace na aktuálním bash proces a tím nepřímo trasování cd tímto způsobem.

Příklad

$ stty -echo
$ cat | strace bash > /dev/null

Což vede k tomu, že jsem schopen vysledovat bash postupujte následovně:

....
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, 

Toto je výzva Bash, kde sedí a čeká na nějaký vstup. Dejme tomu příkaz 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, 

Z výše uvedeného výstupu můžete vidět, kam jsem zadal příkaz, cd .. a stiskněte Enter, (n ). Odtud můžete vidět, že stat() byla zavolána funkce a poté Bash sedí u dalšího read(0..). čekající na další příkaz.


Linux
  1. Příkazy Bash bang:Nezbytný trik pro příkazový řádek Linuxu

  2. Příkaz „eval“ v Bash?

  3. Je možné emulovat starší verze Bash?

  1. Need For The `builtin` Builtin?

  2. Jak změnit počet příkazů uložených v historii Bash

  3. Jaké je použití $# v Bash

  1. Přizpůsobení prostředí Bash

  2. Získejte jednotlivé Man Pages pro Bash Builtin Commands??

  3. Jak časový limit skupiny příkazů v Bash