sh
모든 시작/환경 스크립트를 작성하여 최대한 많이 사용하려고 합니다 .마른그리고 가능한 한 많이: "내가 복제한 모든 *nix에서 작동합니다." 이는 존재하지 않는 코드를 실행하려고 하면 코드가 정상적으로 실패하는지 확인하는 것을 의미합니다. 이렇게 하려면 프로그램이 존재하는지 테스트할 수 있어야 합니다. 파일이 존재하는지 테스트하는 방법을 알고 있지만 해당 경로에서 응용 프로그램이 실행 가능한지 테스트하는 방법을 잘 모르겠습니다. 이 중 일부는 아치, 우분투 및 Centos에서 작동해야 하므로 $PATH를 사용하고 싶습니다. 일부는 루팅되지 않은 시스템의 홈 디렉터리에 설치될 수 있고, 일부는 설치되지 않을 수 있으며, 또 다른 일부는 시스템 경로에 설치될 수 있습니다.
답변1
사용type commandname
. commandname
별칭, 함수, 내장 또는 외부 명령(에서 검색 $PATH
) 과 같은 실행 파일이 있는 경우 true를 반환합니다 . 또는 다음을 사용하십시오.command commandname
commandname
내장 명령이거나 외부 명령(조회)인 경우 true를 반환합니다 $PATH
.
exists () {
type "$1" >/dev/null 2>/dev/null
}
항상 0을 반환하거나 반환하지 않는 일부 sh 변형(확실히 POSIX 이전, /bin/sh
OSF1 ≤3.x에서 발견되는 Almquist 셸의 일부 버전과 초기 NetBSD 버전 및 일부 20세기 Linux 배포판을 알고 있음)이 있습니다 . type
나는 이번 세기에 이런 시스템이 제공되지 않는다고 생각합니다. 해당 항목을 발견하면 $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
.bash $PATH
에서 내장 또는 함수를 사용하는 경우 실행 파일을 테스트하려면 반환 상태가 type -p foo
0입니다. 출력이 비어 있지 않은지 확인해야 합니다. 예를 들어, POSIX에는 없습니다. Debian의 Ash( Ubuntu)에는 없습니다.foo
$PATH
type -p
/bin/sh
답변2
단순히 외부 프로그램을 찾고 있는 경우 which를 사용할 수도 있습니다. 다만 휴대성이 얼마나 좋은지는 잘 모르겠습니다.