$ PATHでワイルドカード文字と一致するコマンドを実行します。

$ PATHでワイルドカード文字と一致するコマンドを実行します。

$PATH現在、このワイルドカードlibreoffice?.?(たとえばlibreoffice4.0libreoffice4.3など)に一致するコマンドを見つけて実行したいと思います。

編集:一致するものが複数見つかった場合は、ランダムに1つを選択できます。

私は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を想定し、1つだけがインストール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パターンを配列キーと一致させ、一致する最初のキーを返すように指示します。

しかし、連想配列の要素には特定の順序がないため最初一致するキーが必ず表示される最初のキーである必要はありません$PATHlibreoffice最大バージョン番号が必要な場合は、次のようにできます。

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

下付き文字フラグはI次に展開されます。みんな一致するキー。n(数字順)とO(逆順)を使用してください。パラメータ拡張フラグ最大バージョン番号から最小バージョン番号にリストを並べ替え、[1]最初のバージョンを選択します。

また見なさい:

whence -m 'libreoffice?.?'

そのコマンドのパスを見つけます。

答え4

以下のように検索コマンドを使用できます。

find ./ -name "libreoffice?.?"

関連情報