বাশের কাছে বিল্টিন কমান্ডগুলি টানা কি সম্ভব?


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
}

সিডি স্ট্রেসিংয়ের কৌশল?

আমি এই কৌশলটি পেরিয়ে এসেছি যেখানে আপনি 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/'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.