bash関数の名前を正規表現として定義する方法

bash関数の名前を正規表現として定義する方法

周辺を検索しましたが、答えが見つかりませんでした。

このような関数を定義したい

function \d{2} () {
    echo $1_or_smth
}

それから端末で話すと

12

12をエコしたいです。

答え1

次の方法はzshで動作します。

preexec() {
  if [[ $1 = <-> ]]; then
    $1() {
      echo $0
      unfunction $0
    }                                                            
  fi
}

あなたの質問に対するコメントで指摘したように、変数名を持つ関数は使用できません。これは、preexecフックを使用してコマンドを傍受し、失敗する前に一時機能を生成することです。私はそのバリエーションであるnmhメーラーを使用して電子メールメッセージを数字で表示します。

答え2

Bashを介してこの機能を使用できますcommand_not_found_handle

注意してくださいㅏ)一部のディストリビューションでは、すでにこれを使用して「インストール」を提供しています。プヴァ使いたいなら金持ちコマンド"機能と雨)シェル関数のように外部コマンドをオーバーライドしません。

また\d、bashで使用される正規表現方言はこの=~演算子をサポートしないことに注意してください(ちなみに、これはbashで正規表現を使用する唯一の方法です)。

2digits(){
    echo "$1_or_smth"
}
command_not_found_handle(){
    if [[ $1 =~ ^[0-9]{2}$ ]]; then 2digits "$@"
    else printf >&2 '%s: command not found\n' "$1"; return 127 
    fi
}

それから

$ 33
33_or_smth
$ 444
444: command not found

この関数を使用してzshでも同じことができますcommand_not_found_handler(名前の違いに注意してください。zshには追加の「r」があります)。

preexecbashではトラップを使用してzshをエミュレートできますが、DEBUGbashは関数名に数字のみを含めることができないため、他の回答のトリックを実装することはできません。

関連情報