Linux 쉘 스크립트: 존재하는 경우에만 프로그램을 실행하고, 존재하지 않으면 무시합니다.

Linux 쉘 스크립트: 존재하는 경우에만 프로그램을 실행하고, 존재하지 않으면 무시합니다.

나는 프로그래밍 중이야리눅스 쉘 스크립트figlet올바른 도구(예:설치됨(이것은 시스템에서 액세스할 수 있습니다.).

예:

#!/usr/bin/env bash
echo "foo"
figlet "Starting"
echo "moo"
figlet "Working"
echo "foo moo"
figlet "Finished"

내 스크립트를 실행하고 싶습니다.오류 없음figlet그럴 때에도설치되지 않음.

무엇이 될 수 있을까?실용적인 방법?

답변1

내 설명은 해당 함수 내에서 도구와 동일한 이름을 가진 래퍼 함수를 ​​사용하고 실제 도구(있는 경우)를 실행하는 것입니다.

figlet() {
  if command -p figlet  >/dev/null 2>&1
    then 
      command figlet "$@"
    else
      :
    fi
}

그러면 figlet arg1 arg2...스크립트가 변경되지 않은 상태로 유지될 수 있습니다.

@Olorin은 더 간단한 접근 방식을 제안했습니다. 필요할 때만 래퍼 함수를 ​​정의합니다(도구가 존재하지 않는 경우).

if ! command -v figlet > /dev/null; then figlet() { :; }; fi

figletFiglet이 설치되지 않은 경우에도 매개변수를 인쇄하려면 Olorin의 제안을 다음과 같이 조정하십시오 .

if ! command -v figlet > /dev/null; then figlet() { printf '%s\n' "$*"; }; fi

답변2

figlet존재 하는지 테스트할 수 있습니다.

if type figlet >/dev/null 2>&1
then
    echo Figlet is installed
fi

답변3

스크립트 시작 부분에서 figlet존재하는지 확인하고 존재하지 않으면 아무 작업도 수행하지 않는 셸 함수를 정의합니다.

type figlet >/dev/null 2>&1 || figlet() { :; }

typefiglet쉘 내장, 별칭 또는 키워드로 존재하는지 확인하고 , >/dev/null 2>&1출력을 얻지 않도록 stdin 및 stdout을 삭제하고, 존재하지 않으면 아무 작업도 수행하지 않는 함수를 figlet() { :; }정의하십시오 .figlet

figlet이렇게 하면 사용하는 스크립트의 모든 줄을 편집 하거나 figlet호출할 때마다 스크립트가 존재하는지 확인할 필요 가 없습니다 .

원하는 경우 진단 메시지를 추가할 수 있습니다.

type figlet >/dev/null 2>&1 || { echo 'figlet not installed.' ; figlet() { :; } ; }

보너스로 어떤 쉘을 사용하고 있는지 언급하지 않았기 때문에 이것이 POSIX 호환이라고 생각하므로 대부분의 쉘에서 작동합니다.

답변4

또 다른 옵션 - 프로젝트 자동 구성 스크립트에서 본 패턴입니다.

if [ -x /usr/bin/figlet ]
then
    FIGLET=/usr/bin/figlet
else
    FIGLET=:
fi

$FIGLET "Hello, world!"

상황에 따라서는 이렇게 하셔도 됩니다.

if [ -x /usr/bin/figlet ]
then
   SAY=/usr/bin/figlet
elif [ -x /usr/local/bin/figlet ]
then
   SAY=/usr/local/bin/figlet
elif [ -x /usr/bin/banner ]
then
   SAY=/usr/bin/banner
else
   SAY=/usr/bin/echo
fi

$SAY "Hello, world!"

정확한 경로를 모르는 경우 여러 가지 elif(위 참조)를 시도하여 알려진 위치를 시도하거나 PATH항상 확인 명령을 사용할 수 있습니다.

if command -v figlet >/dev/null
then
    SAY=figlet
elif command -v banner >/dev/null
then
    SAY=banner
else
    SAY=echo
fi

일반적으로 스크립트를 작성할 때 내가 지정한 특정 위치에서만 명령을 호출하는 것을 선호합니다. 나는 최종 사용자가 자신의 PATH(그리고 아마도 자신의) 물건 에 무엇을 넣을지 모르는 불확실성/위험을 좋아하지 않습니다 ~/bin.

~/bin예를 들어, 내가 호출하는 특정 명령의 출력을 기반으로 파일을 삭제할 수 있는 다른 사람을 위해 복잡한 스크립트를 작성하는 경우 실수로 해당 파일에서 파일을 삭제할 수도 있고 아닐 수도 있는 항목을 선택하고 싶지 않습니다. 기대했다.

관련 정보