$PATH
현재 이 와일드카드 libreoffice?.?
(예: libreoffice4.0
, libreoffice4.3
등) 와 일치하는 명령을 찾아서 실행하고 싶습니다.
편집: 일치하는 항목이 여러 개 발견되면 무작위로 하나를 선택할 수 있습니다.
나는 POSIX 호환 솔루션을 선호합니다.
답변1
콜론으로 구분된 값 IFS
으로 설정합니다 . 명령이 존재한다는 것을 알고 있고 명령의 반환 코드에 관심이 없는 운영 및 전공(예: FreeBSD, OSX, GNU)이 있는 경우 다음 줄을 사용할 수 있습니다.:
PATH
find
-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 탭 완성이 수행되는 작업을 에뮬레이트합니다 libreoffice
Tab.
버전 번호 없이 의도적 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?.?"