사용 가능한 명령이 있는지 확인하고 싶었습니다. 그렇지 않다면 오류 메시지를 인쇄한 다음 종료하고 싶습니다.
변수를 확인하지 않고 이 작업을 수행하고 싶습니다. 왜냐하면 변수는 스크립트의 작은 지점이고 여러 줄에 걸쳐 퍼지는 것을 원하지 않기 때문입니다.
내가 사용하고 싶은 모양은 기본적으로 다음과 같습니다.
rsync --help >> /dev/null 2>&1 || printf "%s\n" "rsync not found, exiting."; exit 1
불행히도 exit 1
결과에 관계없이 rsync가 실행됩니다.
Bash에서 이 Perl 유형 다이 메시지를 사용할 수 있는 방법이 있습니까, 아니면 없습니까?
답변1
질문에 직접 대답하려면 다음과 같이 명령을 그룹화하십시오.
rsync --help >> /dev/null 2>&1 || { printf "%s\n" "rsync not found, exiting."; exit 1; }
당신이 하고 싶은 일을 다른 방식으로 하라는 제안으로서:
#!/usr/bin/env bash
for c in rsync ls doesnotexist othercommand grep
do
if ! type "$c" &> /dev/null
then
printf "$c not found, exiting\n"
exit 1
fi
done
die
쉘에서 Perl을 에뮬레이트하려면 다음을 수행하십시오.
function die {
printf "%s\n" "$@" >&2
exit 1
}
# ...
if ! type "$c" &> /dev/null
then
die "$c not found, exiting"
fi
# ...
답변2
꼭 한 줄이어야 하나요? 나는 단락을 별로 좋아하지 않습니다. 나는 다음과 같이 쓸 것입니다 :
if ! rsync --help &>/dev/null; then
printf "%s\n" "rsync not found, exiting."
exit 1
fi
답변3
(여러 장소에서 동일한 작업을 수행하고 싶을 수 있으므로) 가장 간단한 방법은 함수를 정의하는 것입니다.
die()
{
echo "$@" >2
logger -t "$0" -- "$*"
exit 1;
}
이는 오류 메시지를 표준 오류로 보낸다 는 점에 유의하십시오 die
. 일반적으로 이를 수행하기를 원할 것입니다. 또한 syslog에 메시지를 보내지만(이 메시지를 받는 스크립트는 오랫동안 실행됩니다) 원하지 않는 경우에는 그렇게 할 필요가 없습니다.
그런 다음 간단히 사용할 수 있습니다.
rsync -q --help 2>&- || die "rsync not found, exiting."
rsync -q
나는 또한 성공 사례에서 도움말 출력을 억제 하곤 했습니다 . 실제로 보시면 만족하실 수도 있을 것 같아요
set -e
rsync -q --help
rsync
켜져 있지 않은 경우 $PATH
신고합니다.
$0
:rsync: 명령을 찾을 수 없습니다
(스크립트 이름으로 바꾸고 $0
) 상태 127로 종료합니다.