sudo su dkay
내 예에서는 ... 을 입력하기 시작 <tab>
하고 명령이 약 1분 동안 멈춘 다음 탭을 눌러 완료됩니다 sudo su dkayton
.
어떤 사람이 무슨 일이 일어나고 있는지 이해하기 위해 strace를 사용하라고 제안했습니다.
탭 완성을 위한 기본 명령을 strace에 전달하는 방법에 대한 아이디어가 있습니까?
내가 시도한 것:
top
프로세스를 모니터링하기 위해 셸에서 실행 중입니다 . 그런 다음 즉시 sudo su dkay
다른 셸에서 Tab 키를 눌렀습니다.
그런 다음 가능한 한 빨리 bash 프로세스의 PID를 복사하고 sudo strace -pXXX -tfo /tmp/strace.log
세 번째 셸을 생성했습니다. 여기서 XXX는 복사된 PID입니다.
여전히 2MB가 넘는 로그를 캡처했습니다. 나는 그것을 두 번 반복했고 두 번째에는 더 성공적이었습니다.
저는 이 작업을 수행하는 보다 자동적인 방법을 찾고 있습니다.
답변1
(Linux를 사용한다고 가정) echo $$
현재 쉘의 PID를 가져옵니다. 새 터미널을 열고 다음을 실행합니다.
sudo strace -fp <PID> -o log
이전 셸로 다시 전환하고 탭 완성을 시도해 보세요. 그런 다음 새 터미널로 전환하고 CtrlCend 를 누르십시오 strace
. 출력은 동일한 셸에서 명령을 실행할 log
수도 있습니다 (먼저 자격 증명을 캐시하도록 인증).strace
sudo
sudo -v
sudo strace -fp $$ -o log &
그런 다음 탭 완성을 시도해 보세요. 그것을 죽이려면 , fg
그러면 CtrlC.
그러나 bash를 사용하는 경우 먼저 bash에서 자세한 디버그 출력을 가져오는 것이 가장 좋습니다.
set -o functrace xtrace
PS4=' ${BASH_SOURCE}:$FUNCNAME:$LINENO: '
그런 다음 탭 완성을 시도해 보세요. 후속 출력에서 완성 함수가 수행하는 모든 작업을 수행해야 합니다. 예를 들어:
bash-5.0$ set -o xtrace functrace
bash-5.0$ PS4=' ${BASH_SOURCE}:${FUNCNAME}:$LINENO: '
+ PS4=' ${BASH_SOURCE}:${FUNCNAME}:$LINENO: '
bash-5.0$ sudo su /usr/local/share/bash-completion/bash_completion:_completion_loader:3: local cmd=sudo
/usr/local/share/bash-completion/bash_completion:_completion_loader:5: __load_completion sudo
/usr/local/share/bash-completion/bash_completion:__load_completion:2: dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions)
/usr/local/share/bash-completion/bash_completion:__load_completion:2: local -a dirs
/usr/local/share/bash-completion/bash_completion:__load_completion:3: local 'OIFS=
' IFS=: dir cmd=sudo compfile
/usr/local/share/bash-completion/bash_completion:__load_completion:2021: for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
/usr/local/share/bash-completion/bash_completion:__load_completion:5: dirs+=($dir/bash-completion/completions)
/usr/local/share/bash-completion/bash_completion:__load_completion:2021: for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
/usr/local/share/bash-completion/bash_completion:__load_completion:5: dirs+=($dir/bash-completion/completions)
/usr/local/share/bash-completion/bash_completion:__load_completion:7: IFS='
'
/usr/local/share/bash-completion/bash_completion:__load_completion:9: [[ /usr/local/share/bash-completion/bash_completion == */* ]]