$ 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.