내장 명령을 Bash에 적용 할 수 있습니까?


13

이 질문에서 영감을 얻었습니다 . 내장 명령이 메모리에로드 될 때 , 이것에 대답하는 동안 다음 명령을 시도했지만 실행할 수 없다는 것에 약간 놀랐습니다.

$ strace cd $HOME

내장 명령에 대해 strace를 실행하여 Bash에 사용할 수있는 방법이 있습니까?


1
strace프로그램을 실행하지 않는 것이 추적을하지 않는 것이 놀라운 일이라고 생각 하십니까?
Bananguin

답변:


15

어떻게 strace작동 하는지에 대해 생각한다면 Bash에 내장 된 어떤 것도 추적 할 수 없다는 것이 합리적입니다. strace내장 파일은 그렇지 않지만 실제 실행 파일 만 추적 할 수 있습니다.

예를 들어, 내 cd명령 :

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

strace'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, 

이것은 Bash 프롬프트이며 거기에 앉아 입력을 기다립니다. 다음 명령을 드리겠습니다 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 ..하고 Enter 키 ( \n)를 누르십시오 . 거기에서 stat()함수가 호출되었고 Bash가 다른 read(0..프롬프트에 앉아 다른 명령을 기다리고 있음을 알 수 있습니다.


7

으로 strace하고있는 쉘 cd /some/dir:

{ strace -p "$$" & sleep 1; cd /some/dir; kill "$!"; }

$1여기에 대해 bash,이 안 %%1?
Graeme

1

다음을 시도 할 수 있습니다.

strace bash -c <command/builtin>

예를 들면 다음과 같습니다.

strace bash -c 'cd /path/to/destination/'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.