GNU/Linux >> Belajar Linux >  >> Linux

Apakah Mungkin Untuk Menelusuri Perintah Bawaan ke Bash?

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.


Linux
  1. Perintah bash bang:Trik yang harus diketahui untuk baris perintah Linux

  2. Menyesuaikan shell Bash

  3. Perintah "eval" Di Bash?

  1. Dapatkan Halaman Man Individu Untuk Perintah Bash Builtin??

  2. Basa'?

  3. Apakah Mungkin Meniru Versi Bash yang Lebih Lama?

  1. Bagaimana Cara Melihat Output Dari Proses yang Berjalan Di Sesi Bash Lain?

  2. Perlu Untuk `builtin` Builtin?

  3. Mengecualikan Beberapa Perintah Dari Disimpan Di Bash History?