39947

[code]

    command_not_found_handle () {
        if [[ "$1" =~ [[:digit:]][d+-] ]]; then
            dice "$1"
            return $?
        elif [ -x /usr/lib/command-not-found ]; then
            /usr/lib/command-not-found -- "$1";
            return $?;
        else
            if [ -x /usr/share/command-not-found/command-not-found ]; then
                /usr/share/command-not-found/command-not-found -- "$1";
                return $?;
            else
                printf "%s: command not found\n" "$1" 1>&2;
                return 127;
            fi;
        fi
    }
    
[/code]

上記のように.bashrcで`command_not_found_handle()`を再定義して、特徴的な引数なら該当するプログラムに渡すようにしました。  
オリジナルの関数をそのままコピーしてきて冒頭に処理を挟み込んだのですが、予めオリジナルの関数を`command_not_found_handle_orig()`みたいにリネームしておいて最後に呼び出せばよりスマートだと思いました。

[code]

    command_not_found_handle () {
        if [[ "$1" =~ [[:digit:]][d+-] ]]; then
            dice "$1"
            return $?
        else
            command_not_found_handle_orig "$1"
        fi
    }
    
[/code]

自前で再定義せずに関数の名前だけ変える方法か`type command_not_found_handle | tail
--lines=+3`の出力を利用して関数を再定義する方法はありますでしょうか？


CC BY-SA 3.0
2017-11-30T04:59:11.027
39945
2017-11-30T09:51:49.020
25936
question
bash
定義済みの関数をリネームする方法はありますか？


bash でよいなら、`declare -f` を使ったハックが出来ます。

[code]

    #!/bin/bash
    
    foo () {
        echo foo
    }
    
    eval "orig_$(declare -f foo)"
    
    foo () {
        orig_foo "$@";
        echo bar
    }
    
    # ここで foo を呼び出すと foo bar が出力されます。
    foo
    
[/code]

ただしシェルスクリプトは[動的スコープ](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)を採用しているので、上の方法は一般的な状況においては使えないことに注意してください。気になる場合、単に元の定義を新しい定義に手でコピペする方が良いです。

まず、`.bashrc` のようにトップレベルで評価される場合、他の箇所で `orig_foo` が定義されていないことを確認してください。既存の
`orig_foo` を上書きしてしまったり、他の `orig_foo` で上書きされてしまうかもしれません。

また、関数が再帰呼び出しを含む場合、 **上のコードだと上手くいきません。**
これをするためには関数定義のどの部分が関数呼び出しになっているのか分析できないといけないように思います。また、シェルスクリプトにおいては文字列操作の結果関数呼び出しが生まれる可能性があるので、そこまで対応しようと思うと更に困難になりそうです。

参考: [How do I rename a bash
function?](https://stackoverflow.com/q/1203583/5989200) \-- 本家 Stack Overflow


CC BY-SA 3.0
2017-11-30T07:27:30.690
39947
2017-11-30T09:51:49.020
2017-11-30T09:51:49.020
19110
19110
39945
answer