functionでaliasを実装する。

unsetじゃ駄目だったんだ。

$ function ls { unset ls; echo "This is ls";ls; }; ls ;declare -f ls
This is ls
gosh_wrap  gosh_wrap.c

lsが消えてしまっている。

別の関数を使えば以下のように解決できる。でもかっこわるい。

$ function ls { ls2; } ; function ls2 { unset ls; echo "This is ls2";ls; function ls { ls2; } ; } ; ls ;declare -f ls
This is ls2
gosh_wrap  gosh_wrap.c
ls ()
{
    ls2
}

解決方法は二つ。
・関数内で直接コマンドを呼ぶ・・・あ、フルパスで書けばいいのか。
・自分を再定義する。

もちろん簡単な前者を採用しよう。

$ function ls { echo "This is ls";/bin/ls; }; ls ;declare -f ls
This is ls
gosh_wrap  gosh_wrap.c
ls ()
{
    echo "This is ls";
    /bin/ls
}

あまりにも簡単だった。
何故昨日気がつかない(笑
ということで修正しておこう。

あと 絶対パスを得る為にwhichを使う方法もある。こっちの方が可搬性は高いな。

$ function ls { echo "This is ls";`which ls`;  }; ls ;declare -f ls
This is ls
gosh_wrap  gosh_wrap.c
ls ()
{
    echo "This is ls";
    `which ls`
}

再定義の方はもう頭が回らない…