소스/실행 파일을 나열하는 래퍼 스크립트

소스/실행 파일을 나열하는 래퍼 스크립트

실행되는 명령을 작성하는 것이 가능합니까 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옵션이지만 쉘 참조 중 어느 것도 그렇지 않습니다.
  • 소스 경로와 실행 경로를 구별할 수 있습니까?
  • 이 명령이 실패하는 입증 가능한 특수 사례가 있습니까?

관련 정보