다른 프로그램이 설치되지 않은 경우 실행하는 가장 좋고 가장 짧은 방법

다른 프로그램이 설치되지 않은 경우 실행하는 가장 좋고 가장 짧은 방법

나는 이 코드를 가지고 있습니다 :

#!/bin/bash

num=${1:-undefined}
cmd=$(which {banner,echo} | head -n1)

until [[ "$num" =~ ^[0-9]+$ ]]; do 
    read -p "Type a number: " num
done

for ((num;num>=0;num--)); do
   $cmd $num
   sleep 1
done

하지만 프로그램이 설치되어 있는지 알 수 있는 더 좋은 방법이 있다고 생각합니다. 나는 이것을 시도했습니다. 그러나 나는 그것이 명확하지 않다고 생각합니다.

  1. which banner && cmd=banner || cmd=echo
  2. cmd=$(eval 'which '{banner,echo}'||' :)
  3. cmd=$(which {banner,echo} | head -n1)
  4. cmd=$(which banner || which echo)

나는 다른 것보다 3을 선호하지만 누군가가 이 작업을 수행하는 좋은 방법을 찾는 데 도움을 줄 수 있다고 생각했습니다. type또는 필요한 경우 hash사용 을 수락합니다 .command

이것은 간결한 코드 챌린지이므로 한 줄로 만들고 짧게 유지하고 변수 이름이나 명령( ||, &&등은 제외) 을 반복하지 않으려고 했습니다.

답변1

함수 기반 접근 방식은 가장 명확한 코드를 생성합니다. 적어도 두 가지 변형이 가능하며, 그 중 하나는 FloHim이 위의 댓글에서 제안한 것입니다(이것은 제가 좋아하는 방식이 아닙니다).

function myprint
{
    if type banner >/dev/null
    then  banner "$@"
    else  echo "$@"
    fi
}

myprint "Hello World!"

또는 - 내가 선호하는 변형 - 사용조건부 함수 정의:

if type banner >/dev/null
then  function myprint { banner "$@" ;}
else  function myprint { echo "$@" ;}
fi

myprint "Hello World!"

if호출별 조건부 오버헤드가 없으며 문자열이나 변수 표현식을 반복할 필요가 없습니다(다른 제안에서처럼).

답변2

가장 쉬운 방법은 달리는 것입니다

command1 "hello world" || command2 "hello world"

첫 번째 명령이 없으면 왼쪽 명령이 ||실패하므로 오른쪽 명령이 실행됩니다. 왜 먼저 테스트를 해야 하는지 이해가 안 됩니다. 그냥 해보고, 실패하면 다른 일을 하세요.

누락된 명령으로 인한 오류 메시지를 무시하고 중복 문자열을 피하면 상황이 약간 더 나아질 수 있습니다.

string="Hello world!"
banner "$string" || echo "$string"

명령이 존재하는지 정말로 확인해야 한다면 다음과 같이 하세요.

command="banner"
type "$command"  2>/dev/null || command="echo"
"$command" "Hello world!"

답변3

zsh명령을 해당 경로에 매핑하는 특수 연관 배열 에서 $commands다음을 수행할 수 있습니다.

cmd=${commands[figlet]-${commands[banner]-echo}}

유틸리티 경로가 있는 경우 해당 경로로 설정하고, 다른 경로로 설정하고, 둘 다 없으면 (내장) 로 $cmd설정하는 데 사용됩니다 .figletbannerechofigletbanner

$cmd변수( ) 대신 명령을 정의할 수 있습니다.

hash cmd=${commands[figlet]-${commands[banner]-$commands[echo]}}

echo여기서는 내장 유틸리티가 아닌 독립 실행형 유틸리티로 끝나게 됩니다 . 또한 hash -raka 에서는 hash 명령이 사라집니다 rehash.

관련 정보