나는 프로그래밍 중이야리눅스 쉘 스크립트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
figlet
Figlet이 설치되지 않은 경우에도 매개변수를 인쇄하려면 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() { :; }
type
figlet
쉘 내장, 별칭 또는 키워드로 존재하는지 확인하고 , >/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
예를 들어, 내가 호출하는 특정 명령의 출력을 기반으로 파일을 삭제할 수 있는 다른 사람을 위해 복잡한 스크립트를 작성하는 경우 실수로 해당 파일에서 파일을 삭제할 수도 있고 아닐 수도 있는 항목을 선택하고 싶지 않습니다. 기대했다.