it-swarm-ko.tech

$ PATH에 응용 프로그램이 있는지 확인하려면 어떻게해야합니까?

나는 모든 sh startup/env 스크립트를 작성하여 DRY 만큼 작업하고 있습니다. * nix I clone it to ", 가능한 한. 즉, 거기에없는 코드를 실행하려고하면 코드가 정상적으로 실패하는지 확인합니다. 이를 위해 프로그램이 존재하는지 테스트 할 수 있어야합니다. 파일이 있는지 테스트하는 방법을 알고 있지만 응용 프로그램이 경로 내에서 실행 가능한지 확인하는 방법을 잘 모르겠습니다. 이 중 일부는 Arch, ubuntu 및 centos에서 작동해야하므로 $ PATH를 사용하고 싶습니다. 일부는 내 homedir, 내가 루트가없는 시스템에 설치 될 수 있고, 다른 일부는 설치되지 않았을 수 있으며, 다른 일부는 아직 시스템 경로에 설치되어있을 수 있습니다.

19
xenoterracide

type commandname 를 사용합니다. commandname이 별칭, 함수, 내장 또는 외부 명령 ($PATH에서 조회 됨)과 같이 실행 가능한 경우 true를 반환합니다. 또는 commandname이 내장 또는 외부 명령 (command commandname에서 조회 됨)이면 true를 반환하는 $PATH 를 사용합니다.

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

몇 가지 sh 변형이 있습니다 (확실히 POSIX 이전입니다. OSF1 ≤3.x에서 /bin/sh를 알고 있으며 초기 NetBSD 버전과 20 세기 Linux 배포판에서 발견 된 Almquist Shell의 일부 버전). 여기서 type 항상 0을 반환하거나 존재하지 않습니다. 이번 밀레니엄과 함께 제공된 시스템은 없다고 생각합니다. 이러한 문제를 발견 한 경우 $PATH에서 수동으로 검색하는 데 사용할 수있는 기능은 다음과 같습니다.

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

이 함수는 내장 및 함수를 제외하고 $PATH에서 이름을 조회하려는 경우 일반적으로 유용합니다. 대부분의 셸에는이를위한 내장 command -v 가 있지만 비교적 최근에 POSIX에 추가되었습니다. (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에서 foo이 내장 또는 함수이면 type -p foo의 반환 상태는 0입니다. $PATH에서 실행 파일을 테스트하려면 출력이 비어 있지 않은지 확인해야합니다. type -p는 POSIX에 없습니다. 예를 들어 Debian의 ash (Ubuntu에서는 /bin/sh)에는 없습니다.

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

1
Kim