쉘 스크립트에 명령이 있는지 확인하는 방법? [복제]
이 질문에는 이미 답변이 있습니다.
첫 번째 셸 스크립트를 작성 중입니다. 내 스크립트에서 특정 명령이 있는지 확인하고 없으면 명령을 설치하고 싶습니다. 이 명령이 존재하는지 어떻게 확인합니까?
if #check that foobar command doesnt exist
then
#now install foobar
fi
일반적으로 쉘에 따라 다르지만 bash, zsh, ksh 또는 sh (대시로 제공)를 사용하면 다음이 작동합니다.
if ! type "$foobar_command_name" > /dev/null; then
# install foobar here
fi
실제 설치 스크립트 type
의 경우 alias가있는 경우 성공적으로 반환되지 않는 것이 foobar
좋습니다. bash에서는 다음과 같이 할 수 있습니다.
if ! foobar_loc="$(type -p "$foobar_command_name")" || [[ -z $foobar_loc ]]; then
# install foobar here
fi
사용해보십시오 type
:
type foobar
예를 들면 다음과 같습니다.
$ type ls
ls is aliased to `ls --color=auto'
$ type foobar
-bash: type: foobar: not found
which
몇 가지 이유로 선호됩니다 .
1) 기본 which
구현 -a
은 모든 옵션을 표시 하는 옵션 만 지원 하므로 별명을 지원하는 대체 버전을 찾아야합니다.
2) type은보고있는 것을 정확하게 알려줍니다 (bash 함수 또는 별칭 또는 적절한 바이너리).
3) 유형에는 하위 프로세스가 필요하지 않습니다.
4) 유형은 바이너리로 마스킹 될 수 없습니다 (예를 들어, 리눅스 박스 which
에서 실제 앞에 경로에 나타나는 프로그램을 만들면 which
, 팬에 부딪 히게됩니다. type
반면에, 쉘은 내장되어 있습니다 [ 예, 부하 직원이 실수로이 작업을 한 번 수행했습니다.]
bash의 경우 4 가지, zsh의 경우 1 가지 추가 :
type foobar &> /dev/null
hash foobar &> /dev/null
command -v foobar &> /dev/null
which foobar &> /dev/null
(( $+commands[foobar] ))
(zsh 만)
당신은 당신의 if
절 에 그들 중 하나를 넣을 수 있습니다 . 내 테스트 ( https://www.topbug.net/blog/2016/10/11/speed-test-check-the-existence-of-a-command-in-bash-and-zsh/ )에 따르면 bash에서는 첫 번째 및 세 번째 방법이 권장되고 속도 측면에서 zsh에서는 다섯 번째 방법이 권장됩니다.
Bash 스크립트에서 프로그램이 존재하는지 확인하십시오 . 모든 쉘 스크립트에서 실행 가능한 command -v $command_name
경우 테스트를 위해 실행하는 것이 가장 좋습니다 $command_name
. bash에서는 hash $command_name
경로 검색 결과를 해시하거나 type -P $binary_name
함수만이 아닌 바이너리 만보 고 싶다면을 사용할 수 있습니다
이 질문은 껍질을 지정하지 않으므로 물고기를 사용하는 사람들에게 친숙한 대화 형 껍질 :
if command --search foo >/dev/null do
echo exists
else
echo does not exist
end
기본 POSIX 호환성을 -v
위해 --search
또는에 대한 별명 인 플래그를 사용하십시오 -s
.
which <cmd>
귀하의 사례에 해당되는 경우 별명에 대한 옵션 which
지원 도 참조하십시오 .
예
$ which foobar
which: no foobar in (/usr/local/bin:/usr/bin:/cygdrive/c/Program Files (x86)/PC Connectivity Solution:/cygdrive/c/Windows/system32/System32/WindowsPowerShell/v1.0:/cygdrive/d/Program Files (x86)/Graphviz 2.28/bin:/cygdrive/d/Program Files (x86)/GNU/GnuPG
$ if [ $? -eq 0 ]; then echo "foobar is found in PATH"; else echo "foobar is NOT found in PATH, of course it does not mean it is not installed."; fi
foobar is NOT found in PATH, of course it does not mean it is not installed.
$
추신 : 설치된 모든 것이 PATH에있는 것은 아닙니다. 일반적으로 무언가가 "설치"되었는지 여부를 확인하기 위해 OS와 관련된 설치 관련 명령을 사용합니다. 예 rpm -qa | grep -i "foobar"
를 들어 RHEL.
정확히 이것을 위해 만들어진 설치 스크립트에있는 기능
function assertInstalled() {
for var in "$@"; do
if ! which $var &> /dev/null; then
echo "Install $var!"
exit 1
fi
done
}
예제 호출 :
assertInstalled zsh vim wget python pip git cmake fc-cache
bash와 zsh에서 모두 작동하는 함수 :
# Return the first pathname in $PATH for name in $1
function cmd_path () {
if [[ $ZSH_VERSION ]]; then
whence -cp "$1" 2> /dev/null
else # bash
type -P "$1" # No output if not in $PATH
fi
}
에 명령이 없으면 0이 아닌 값이 반환됩니다 $PATH
.
참고 URL : https://stackoverflow.com/questions/7522712/how-to-check-if-command-exists-in-a-shell-script
'Programing' 카테고리의 다른 글
뷰 홀더가있는 Android Recyclerview 및 ListView (0) | 2020.06.19 |
---|---|
권한은 ... 프로파일을 지정했습니다. (0) | 2020.06.19 |
Eclipse IDE : 텍스트를 확대하는 방법? (0) | 2020.06.19 |
sqlite3.ProgrammingError : 잘못된 바인딩 수가 제공되었습니다. (0) | 2020.06.19 |
올바른 HTTP 상태 코드를 잘못된 입력으로 (0) | 2020.06.19 |