Terinspirasi oleh pertanyaan ini, berjudul:Kapan perintah bawaan dimuat ke memori, ketika mencoba menjawab ini, saya mencoba perintah berikut dan sedikit terkejut bahwa saya tidak dapat menjalankannya:
$ strace cd $HOME
Apakah ada metode yang dapat saya gunakan untuk menjalankan strace untuk perintah bawaan ke Bash?
Jawaban yang Diterima:
Jika Anda berpikir tentang bagaimana strace
berfungsi maka sangat masuk akal bahwa tidak ada bawaan ke Bash yang dapat dilacak. strace
hanya dapat melacak executable yang sebenarnya, sedangkan bawaan tidak.
Misalnya, cd
saya perintah:
$ type cd
cd is a function
cd ()
{
builtin cd "[email protected]";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Trik strace'ing cd?
Saya menemukan teknik ini di mana Anda dapat memanggil strace
pada bash
actual yang sebenarnya proses dan dengan demikian, secara tidak langsung melacak cd
seperti itu.
Contoh
$ stty -echo
$ cat | strace bash > /dev/null
Yang membuat saya dapat menelusuri bash
proses sebagai berikut:
....
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,
Ini adalah prompt Bash, di mana ia duduk di sana, menunggu beberapa masukan. Jadi mari kita beri perintah 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,
Dari output di atas, Anda dapat melihat di mana saya mengetikkan perintah, cd ..
dan tekan enter, (n
). Dari sana Anda dapat melihat bahwa stat()
fungsi dipanggil, dan setelah itu Bash duduk di read(0..
. lain) prompt, menunggu perintah lain.