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` }
再定義の方はもう頭が回らない…