$ PATH에 응용 프로그램이 있는지 테스트하려면 어떻게합니까?


19

sh가능한 많은 DRY를 사용 하고 "복제하는 모든 * nix에서 작동"하는 많은 시작 / env 스크립트를 모두 작성하려고 합니다. 이것은 존재하지 않는 코드를 실행하려고하면 코드가 정상적으로 실패한다는 것을 의미합니다. 이를 위해 프로그램이 존재하는지 테스트 할 수 있어야합니다. 파일이 있는지 테스트하는 방법을 알고 있지만 경로 내에서 응용 프로그램이 실행 가능한지 테스트하는 방법을 잘 모르겠습니다. 이 중 일부는 아치, 우분투 및 센토에서 작동해야하기 때문에 $ PATH를 사용하고 싶습니다. 일부는 내 홈 디렉토리에, 루트가없는 시스템에 설치되고, 다른 것은 설치되지 않을 수 있으며, 다른 시스템 경로에 설치 될 수 있습니다.


2
이 SO 답변 은 그러한 질문에 대해 북마크 한 것입니다.
— jw013

답변:


19

사용하십시오 type commandname. commandname별명, 함수, 내장 또는 외부 명령 (에서 조회 $PATH)으로 실행 가능한 것이 있으면 true를 리턴합니다 . 또는 내장 명령 또는 외부 명령 (에서 조회 ) 인 command commandname경우 true를 반환하는를 사용하십시오 .commandname$PATH

exists () {
  type "$1" >/dev/null 2>/dev/null
}

몇 가지 sh 변형이 있습니다 (확실히 사전 POSIX; /bin/shOSF1 ≤3.x 및 초기 NetBSD 버전에서 발견 된 Almquist 쉘의 일부 버전 및 20 세기 Linux 배포판에 대해 알고 있음)는 type항상 0을 반환하거나 그렇지 않습니다 있다. 나는이 천년과 함께 제공된 시스템은 없다고 생각합니다. 이 문제가 발생하면 $PATH수동으로 검색하는 데 사용할 수있는 기능이 있습니다 .

exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }

이 함수는 일반적으로 내장 함수를 제외하고에서 이름을 조회하려는 경우에 유용합니다 $PATH. command -vPOSIX에 비교적 최근에 추가 되었음에도 불구하고 대부분의 쉘에는이 기능이 내장되어 있습니다 (여전히 POSIX : 2004에서 선택 사항 임). 기본적으로 프로그래머 친화적 인 버전입니다 type:의 실행 파일에 대한 전체 경로 $PATH, 내장 또는 함수의 기본 이름 및 별칭의 별칭 정의를 인쇄합니다.

exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}

Ksh, bash 및 zsh는 type -p에서 실행 파일 만 찾아야합니다 $PATH. bash에서 내장 또는 함수 인 type -p foo경우 리턴 상태 는 0 foo입니다. 에서 실행 파일을 테스트 $PATH하려면 출력이 비어 있지 않은지 확인해야합니다. type -pPOSIX에 없습니다. 예를 들어 데비안의 재 ( /bin/sh우분투에 있음)에는 없습니다.


@ 아가미, 이것 (또는 비슷한 것) if [ type keychain ]; then이 작동하지 않습니까? 나는 /home/xenoterracide/.zshrc:84: parse error: condition expected: type함수가 존재한다고 생각할 수 있다고 생각한다. 나는 단지 이것이 어떤 의미에서는 더 단순 할 것이라고 생각했다.
— xenoterracide

@ xenoterracide : 괄호를 버려라!
— Gilles 'SO- 악의를 멈춰라

나는 당신이 찾고있는 생각 if type $APP >/dev/null 2>/dev/null; then ...당신은 원하지 않는다 [].
— Steven D

4
바, 나는 내가 상쾌해야한다는 것을 알았다. Gilles에게 다시 맞았다!
— Steven D

type -p$PATH별명, 함수 또는 내장이 아닌 명령을 구체적으로 찾고 있다면 .
— ephemient

1

외부 프로그램 만 찾고 있다면 어느 프로그램을 사용할 수도 있습니다. 그것이 얼마나 휴대용인지 모르겠다.


3
이론적으로, type또는 보다 휴대 성이 떨어집니다 command. which예를 들어 POSIX에 없습니다. 실제로 which는 거의 모든 곳에 존재하지만 (csh 스크립트로 구현되는) 일부 위치에서는 (로 인해) 다른 경로를 사용 .cshrc하여 목적을 무효화합니다.
— Gilles 'SO- 악마 중지'12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.