실행되는 my.sh
명령을 작성할 수 있습니까?이 스크립트가 시작되거나 실행되는 각 경로를 반복적으로 인쇄합니다.- 그건,원래 코드를 변경하지 마십시오근본적으로? 시간이 많이 걸리고 오류가 발생하기 쉬운 수동 추적 없이 특정 실행 경로에 실제로 사용되는 파일을 확인하는 것이 아이디어입니다.
예를 들어:
$ > my.sh cat <<'EOF'
#!/bin/sh
. ./foo.sh
EOF
$ > foo.sh cat <<'EOF'
#!/bin/sh
./bar.sh
EOF
$ > bar.sh cat <<'EOF'
#!/bin/sh
echo bar
EOF
$ chmod u+x my.sh bar.sh
$ magic command
[...]
./my.sh
./foo.sh
./bar.sh
답변1
이것은 트릭을 수행하는 것 같습니다
$ strace -fe open ./my.sh 2>&1 >/dev/null | \
grep --only-matching '^\(\[pid\s\+[0-9]*\] \)\?open("[^"]\+' | \
grep --only-matching '".*' | \
cut --characters 2-
즉, 실행 및 인쇄 open
호출을 추적하고 stdout 및 stderr을 교환한 다음 결과 형식을 지정하여 관련 없는 텍스트를 제거합니다.
또한 큰 문제가 아닌 일부 라이브러리 경로도 인쇄합니다.
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
./my.sh
./foo.sh
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
./bar.sh
남은 질문:
- 쉘 경로와 라이브러리 경로를 확실하게 구별할 수 있는 방법이 있습니까? 모든 라이브러리 참조가 다음을 사용하므로 후자가 가능해 보입니다.
O_CLOEXEC
옵션이지만 모든 쉘 참조는 이를 수행하지 않습니다. - 소스 경로와 실행 경로를 구별할 수 있나요?
- 이 명령이 실패하는 명백한 극단적인 경우가 있습니까?