|| 뒤에 두 개의 명령을 입력하세요.

|| 뒤에 두 개의 명령을 입력하세요.

사용 가능한 명령이 있는지 확인하고 싶었습니다. 그렇지 않다면 오류 메시지를 인쇄한 다음 종료하고 싶습니다.

변수를 확인하지 않고 이 작업을 수행하고 싶습니다. 왜냐하면 변수는 스크립트의 작은 지점이고 여러 줄에 걸쳐 퍼지는 것을 원하지 않기 때문입니다.

내가 사용하고 싶은 모양은 기본적으로 다음과 같습니다.

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로 종료합니다.

관련 정보