Programing

쉘 스크립트에 명령이 있는지 확인하는 방법?

lottogame 2020. 6. 19. 19:23
반응형

쉘 스크립트에 명령이 있는지 확인하는 방법? [복제]


이 질문에는 이미 답변이 있습니다.

첫 번째 셸 스크립트를 작성 중입니다. 내 스크립트에서 특정 명령이 있는지 확인하고 없으면 명령을 설치하고 싶습니다. 이 명령이 존재하는지 어떻게 확인합니까?

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

반응형