क्या बैश करने के लिए बिलिन कमांड को स्ट्रे करना संभव है?


13

इस सवाल से प्रेरित होकर, शीर्षक से: जब अंतर्निहित कमांड को मेमोरी में लोड किया जाता है , तो इसका उत्तर देने का प्रयास करते हुए मैंने निम्न कमांड की कोशिश की और थोड़ा आश्चर्यचकित था कि मैं इसे नहीं चला सकता:

$ strace cd $HOME

क्या कोई ऐसा तरीका है जिससे मैं बैश करने के लिए बिलिन कमांड के लिए स्ट्रेस चलाने के लिए उपयोग कर सकता हूं?


1
आपको क्यों लगता है कि यह आश्चर्य की बात है कि straceएक कार्यक्रम नहीं चलाने के परिणामस्वरूप ट्रेस नहीं होता है?
बनगुंगिन

जवाबों:


15

यदि आप सोचते हैं कि कैसे straceकाम करता है तो यह पूरी तरह से समझ में आता है कि बाश के लिए कोई भी निर्माण ट्रेस करने योग्य नहीं होगा। straceकेवल वास्तविक निष्पादनों का पता लगा सकते हैं, जबकि निर्मित नहीं हैं।

उदाहरण के लिए, मेरी cdआज्ञा:

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

Std'ing cd के लिए ट्रिक?

मैं इस तकनीक के पार आया था जहाँ आप straceवास्तविक bashप्रक्रिया पर जा सकते थे और cdइस तरह अप्रत्यक्ष रूप से उस रास्ते का पता लगा सकते थे।

उदाहरण

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

मेरे द्वारा इस bashप्रक्रिया को निम्न प्रकार से स्ट्रेस करने में सक्षम होने के परिणामस्वरूप :

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

यह बैश प्रॉम्प्ट है, जहां यह वहां बैठा है, कुछ इनपुट की प्रतीक्षा कर रहा है। तो चलिए इसे आज्ञा देते हैं 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, 

उपरोक्त आउटपुट से, आप देख सकते हैं कि मैंने कमांड कहां टाइप किया है, cd ..और एंटर दबाएं, ( \n)। वहां से आप देख सकते हैं कि stat()फ़ंक्शन को कॉल किया गया था, और उसके बाद बैश दूसरे read(0..प्रॉम्प्ट पर बैठा है, एक और कमांड की प्रतीक्षा कर रहा है।



1

आप निम्नलिखित की कोशिश कर सकते हैं:

strace bash -c <command/builtin>

उदाहरण के लिए:

strace bash -c 'cd /path/to/destination/'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.