소프트웨어가 설치되었는지 여부를 스크립트에서 감지하는 가장 좋은 방법은 무엇입니까?


9

나는 which다른 플랫폼 (Linux vs. Solaris vx. OS X) 에서 명령의 출력 차이로 인해 좌절 했으며 다른 쉘도 문제를 일으킬 수 있습니다. type더 나은 대안으로 제안되었지만 얼마나 이식성이 좋습니까?

과거 which에는 다른 유스 케이스 의 출력을 구문 분석 하고 처리하는 함수를 작성 했습니다. 그것들은 내가 사용하는 컴퓨터에서 작동하므로 개인 스크립트에는 괜찮지 만 다른 사람들이 사용할 수 있도록 게시 할 소프트웨어에는 믿기지 않을 것 같습니다.

가능한 한 가지 예를 들어, bash와 zsh가 시스템에서 사용 가능한지 여부를 스크립트에서 감지 한 다음 zsh가 있으면 zsh를 사용하고 zsh가 없으면 bash를 사용하여 명령을 실행한다고 가정하십시오. 특정 버그가없는 버전입니다. 스크립트의 나머지 부분은 Bourne 쉘 또는 Ruby 또는 기타 다른 것이 될 수 있지만 zsh 또는 최신 버전의 bash를 사용하여 수행해야하는 특정 작업 (AFAIK)입니다.

나는 신뢰할 수있는 type플랫폼에서 사용할 수있는? which특정 소프트웨어가 설치되어 있는지에 대한 질문에 쉽고 일관성있게 답변 할 수있는 다른 대안 이 있습니까?

(내가 제시 한 예와 구체적으로 아이디어를주고 싶다면 훌륭하지만, 주로 일반적인 경우에 대해 묻고 있습니다. 특정 기계에 특정 물체가 설치되어 있는지 확인하는 가장 신뢰할 수있는 방법은 무엇입니까? ?)

답변:


10

21 세기에는 특히 bash 또는 zsh가있을 가능성이있는 머신을 대상으로하는 경우 type사용 가능할 수 있습니다. (이것은 1970 년대 또는 1980 년대 초와 같이 매우 오래된 유니 세에는 존재하지 않았습니다.) 결과를 의미 할 수는 없지만 그 이름으로 명령이 있으면 0을 반환 할 수 있습니다. 그렇지 않으면 0이 아닙니다.

which표준이 아니며 실제로 신뢰할 수 없습니다 . type권장되는 대안입니다. whereis같은 문제로 고통 받고 which덜 흔합니다. whenceksh 및 zsh에만 해당됩니다.

가능하면 명령의 존재를 테스트하고 해당 동작이 합리적인지 테스트하는 것이 더 안정적입니다. 예를 들어, 실행 배시 적합한 버전의 존재를 시험 bash -c 'somecommand'

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

오늘날 Singe UNIX 사양 버전 2 의 거의 모든 것을 믿을 수 있습니다 (어쨌든 선택적인 Fortran 및 SCCS와 같은 이국적인 항목은 제외). 대부분의 버전 3 도 사용할 수 있지만 아직 완전히 구현되지는 않았습니다. 버전 4 지원은 스케치입니다. 이 스펙을 읽으려면 버전 2보다 읽기 쉽고 모호하지 않은 버전 3을 읽는 것이 좋습니다.

시스템 특이성을 감지하는 방법에 대한 예제는 autoconfconfigure다양한 소프트웨어의 스크립트를보십시오.

추가 정보 는 휴대용 쉘 프로그래밍 관련 자료를 참조하십시오 .


이는 hashand 을 사용하여 일반적으로 권장되는 기술에 대한 의견을 확대하는 데 도움이 될 수 있습니다 command -v.
Caleb

@Caleb이 질문의 목적 command -vtype, over 의 이점을 보지 못합니다 . 부울 결과입니다. 당신이 말하는 "일반적으로 권장되는 기술 hash"은 무엇입니까 ?
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.