$PATH에서 와일드카드 문자와 일치하는 명령을 실행합니다.

$PATH에서 와일드카드 문자와 일치하는 명령을 실행합니다.

$PATH현재 이 와일드카드 libreoffice?.?(예: libreoffice4.0, libreoffice4.3등) 와 일치하는 명령을 찾아서 실행하고 싶습니다.

편집: 일치하는 항목이 여러 개 발견되면 무작위로 하나를 선택할 수 있습니다.

나는 POSIX 호환 솔루션을 선호합니다.

답변1

콜론으로 구분된 값 IFS으로 설정합니다 . 명령이 존재한다는 것을 알고 있고 명령의 반환 코드에 관심이 없는 운영 및 전공(예: FreeBSD, OSX, GNU)이 있는 경우 다음 줄을 사용할 수 있습니다.:PATHfind-quit-maxdepth

pattern='libreoffice?.?'
IFS=:; find $PATH -maxdepth 1 -type f -name "$pattern" -exec {} \; -quit; unset IFS

이는 명령이 발견되었는지 보고하는 쉬운 방법을 제공하지 않습니다. 또한 더욱 강력해지려면 값에 와일드카드가 포함된 경우 와일드카드를 끄십시오 PATH. 또는 PATH현재 디렉터리를 나타내는 빈 구성 요소가 있을 수 있습니다 (그러나 내 제안은 .이를 사용하는 것입니다). 아래 코드는 이러한 모든 복잡성을 해결합니다.

pattern='libreoffice?.?'
case $PATH in
  :*) directories=.$PATH;;
  *::*) directories=${PATH%%::*}:.:${PATH#*::};;
  *:) directories=$PATH.;;
  *) directories=$PATH;;
esac
set -f; IFS=:
cmd=
for d in $directories; do
  set +f
  for x in "$d"/$pattern; do
    if [ -x "$x" ] && ! [ -d "$x" ]; then
      cmd=$x
      break
    fi
  done
  if [ -n "$cmd" ]; then break; fi
done
set +f; unset IFS
if [ -z "$cmd" ]; then
  echo 1>&2 "$pattern: not found in PATH"
  exit 127
else
  exec "$cmd"
fi

일반 sh, bash, ksh 등 대신 zsh를 사용하는 경우 강력한 솔루션을 찾는 것이 훨씬 간단합니다.

pattern='libreoffice?.?'
matches=($^path/$~pattern(N.*[1]))
if ((!#matches)); then
  $matches[1]
else
  echo 1>&2 "$pattern: not found in PATH"
  exit 127
fi

답변2

더 간단한 대안은 다음과 같습니다.

$(compgen -c libreoffice)

bash를 가정하고 하나만 libreoffice*설치되어 있다고 가정합니다.

를 입력하면 bash 탭 완성이 수행되는 작업을 에뮬레이트합니다 libreofficeTab.

버전 번호 없이 의도적 libreoffice으로 제외하려고 하고 여러 버전의 존재를 처리하려는 경우 다음을 시도하십시오.

run_libreoffice() {
    compgen -c libreoffice |
        while read -r exe; do
            case "$exe" in libreoffice?.?)
                "$exe" "$@"
                return
                ;;
            esac
        done
}
run_libreoffice "$@"

case명령문은 match only 로 만들고 libreoffice?.?첫 번째 결과만 실행하면서 결과를 반복합니다.

답변3

그리고 zsh:

$commands[(i)libreoffice?.?]

에서는 키가 명령 이름이고 값이 경로인 특수 연관 배열입니다 zsh.$commands

i위는배열 아래 첨자 플래그zsh패턴을 배열 키와 일치시키고 일치하는 첫 번째 키를 반환하도록 지시합니다 .

그러나 연관 배열의 요소에는 특정 순서가 없으므로첫 번째일치하는 키가 반드시 에 나타나는 첫 번째 키일 필요는 없습니다 $PATH. libreoffice최대 버전 번호를 원하면 다음과 같이 할 수 있습니다.

${${(nO)${commands[(I)libreoffice?.?]}}[1]}

아래 첨자 플래그는 I다음으로 확장됩니다.모두일치하는 키. n(숫자순)과 O(역순)을 사용합니다 .매개변수 확장 플래그가장 큰 버전 번호에서 가장 작은 버전 번호로 목록을 정렬하고 [1]첫 번째 버전을 선택합니다.

또한보십시오:

whence -m 'libreoffice?.?'

해당 명령의 경로를 찾으십시오.

답변4

아래와 같이 찾기 명령을 사용할 수 있습니다.

find ./ -name "libreoffice?.?"

관련 정보