쉘 스크립트에서 사용되는 모든 프로그램 나열

쉘 스크립트에서 사용되는 모든 프로그램 나열

스크립트를 실제로 실행하지 않고 실행할 때 스크립트가 사용할 모든 프로그램을 나열하는 방법을 찾으려고 노력 중입니다.

나는 다음과 같은 빠르고 더러운 농담을 썼습니다.

# fill an array with all the useful words except variables, options, brackets, quotes
readarray -t list <<<$( grep -v '^#' script.sh | sed 's/[0-9a-zA-Z_\-]*=//g ; s/\${.*}//g ; s/\$(//g ; s/[)'\"\'\`']//g ; s/ --*.//g ' )

# for every word in array show info with `type' and clean the output again
for p in "${list[@]}" ; do type "${p}" ; done 2>&1 | grep -v -e '^bash:' -e 'shell keyword' -e 'shell builtin' | sort | uniq | sed 's/^.* //g ; s/[\(\)]//g'

내 생각에 문제는 다음과 같다.

  1. 프로그램이 설치되어 있지 않으면 "Enter"가 실패합니다.
  2. 여기 문서에는 키워드가 포함될 수도 있고 프로그램이 될 수도 있습니다...
  3. 스크립트가 잘못 작성되면 난이도가 높아질 수 있습니다("shellcheck"가 유용할 수 있음).
  4. 외부 구성 파일 및 라이브러리를 추적하지 마십시오(ilkkachu 주석 참조).

더 나은 해결책이 있습니까?

답변1

게시물 #16에서https://www.unix.com/shell-programming-and-scripting/268856-how-pre-check-scrutinize-all-my-shell-scripts.html나는 150줄의 Perl 스크립트를 게시했습니다.p1.txt이는 유용한 출발점이 될 수 있습니다. 링크도 추가했어요더욱 완벽하고 복잡한 쉘 파서

전체 스레드를 확인하는 것이 가장 좋습니다. 다른 관점도 흥미로울 수 있습니다.

행운을 빕니다... 건배, drl

답변2

이것은 쉬운 일이 아닙니다. 당신은 이미 이러한 어려움 중 몇 가지를 확인했습니다. 텍스트 기반 구문 분석은 오류가 발생하기 쉽고 우회하기 쉽고(선택한 경우) 거의 확실히 불완전합니다.

Bash에는 실제로 스크립트를 실행하지 않고 스크립트를 구문 분석하는 "set" 내장 함수가 있습니다. 이것이 도움이 될 수 있지만 그것도 제한적입니다.

  [set] -n      Read commands but do not execute them.  This may be used
                  to  check  a  shell  script  for syntax errors.  This is
                  ignored by interactive shells.

스크립트에서 테스트하려면 set -n스크립트 시작 부분에 추가하고 실행하면 됩니다.

strace매우 유용하지만 실제로 실행하려면 스크립트가 필요합니다. 이는 스크립트가 안전하다고 확신할 때 수행하는 작업입니다.

관련 정보