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.

조심하세요ㅏ)일부 배포판에서는 이미 이를 사용하여 "설치"를 제공합니다.푸바사용하고 싶다면부자명령" 기능 및비)쉘 함수처럼 외부 명령을 재정의하지 않습니다.

또한 \dbash에서 사용하는 정규식 방언은 이 =~연산자를 지원하지 않는다는 점에 유의하세요(덧붙여서, 이것은 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는 함수 이름에 숫자만 포함하는 것을 허용하지 않기 때문에 다른 답변의 트릭을 구현할 수 없습니다.

관련 정보