which
이전에는 다양한 플랫폼(Linux와 Solaris vx. OS X)에서 명령 출력이 달라서 좌절감을 느꼈고, 다른 쉘도 이 문제에 영향을 미칠 수 있습니다. type
더 나은 대안으로 제안되었지만 이식성은 얼마나 됩니까?
과거에는 출력을 구문 분석 which
하고 내가 접한 다양한 사용 사례를 처리하는 함수를 작성했습니다. 그것들은 내가 사용하는 컴퓨터에서 작동하므로 내 개인 스크립트에는 괜찮지만 다른 사람들이 사용할 수 있도록 다른 곳에 게시할 소프트웨어의 경우 매우 불안정해 보입니다.
가능한 예를 들기 위해, bash와 zsh가 머신에서 사용 가능한지 스크립트를 통해 감지한 다음 zsh가 있으면 zsh를 사용하고 zsh가 없고 bash만으로 충분하면 bash를 사용하여 명령을 실행해야 한다고 가정해 보겠습니다. 버전별 버그는 없습니다. 나머지 스크립트의 대부분은 Bourne Shell이나 Ruby 등이 될 수 있지만, 이 특정 작업은 zsh나 최신 버전의 bash(내가 아는 한)를 사용하여 수행되어야 합니다.
type
크로스 플랫폼 가용성을 기대할 수 있습니까 ? which
특정 소프트웨어를 설치할지 여부에 대한 질문에 쉽고 일관되게 대답할 수 있는 대안이 있습니까 ?
(제가 제시한 예와 구체적으로 관련된 생각을 제공하고 싶다면 괜찮습니다. 하지만 대부분 일반적인 질문입니다. 특정 컴퓨터에 특정 항목이 설치되어 있는지 확인하는 가장 신뢰할 수 있는 방법은 무엇입니까?)
답변1
21세기에는 특히 대상 머신에 bash나 zsh가 있을 수 있다면 괜찮습니다 type
. (1970년대나 1980년대 초처럼 아주 오래된 unice에는 존재하지 않았습니다.) 출력이 아무 의미도 없을 것으로 기대할 수는 없지만, 해당 이름의 명령이 있으면 0을 반환하고 그렇지 않으면 0이 아닐 것으로 예상할 수 있습니다.
which
표준이 아니며실제로는 신뢰할 수 없습니다. type
권장되는 대안입니다. whereis
같은 문제가 발생했지만 which
덜 일반적입니다. whence
ksh 및 zsh에만 해당됩니다.
가능하다면 명령이 존재하는지 테스트하고 명령의 동작이 합리적인지 테스트하는 것이 더 안정적일 것입니다. 예를 들어, 다음을 실행하여 적합한 버전의 bash가 존재하는지 테스트하십시오 bash -c 'somecommand'
.
# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …
오늘날 당신은 거의 모든 것을 믿을 수 있습니다단일 UNIX 사양 버전 2(어쨌든 선택 사항인 Fortran 및 SCCS와 같은 외래종은 제외). 가장 신뢰할 수 있습니다.버전 3이는 또한 사실이지만 아직 모든 곳에서 완전히 구현되지는 않았습니다.버전 4지원은 대략적입니다. 이 사양을 읽고 싶다면 버전 2보다 더 읽기 쉽고 명확한 버전 3을 읽는 것이 좋습니다.
시스템 특성을 감지하는 방법에 대한 예는 다음을 참조하세요.자동 구성configure
다양한 소프트웨어에 대한 스크립트 .
당신은 또한 볼 수 있습니다휴대용 쉘 프로그래밍 리소스더 많은 팁을 알아보세요.