$PATH
現在、このワイルドカードlibreoffice?.?
(たとえばlibreoffice4.0
、libreoffice4.3
など)に一致するコマンドを見つけて実行したいと思います。
編集:一致するものが複数見つかった場合は、ランダムに1つを選択できます。
私は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を想定し、1つだけがインストール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?.?"