hitode909の日記

趣味はマリンスポーツですの日記です

screenのaliasを修正しました.

以前.screenのセッションを便利に利用するaliasを書いたのですが,id:mollifierさんに,教えていただいて,リファクタリングしました.

仕様

  • s すると,pwdの最後のディレクトリの名前のscreenをアタッチしようとする(なければ作る)
  • s nameすると,指定された名前のscreenをアタッチしようとする(なければ作る)
  • 具体的には,~/checkoutでsすると,checkoutという名前のscreenができて,どこかで,s checkoutすると,さっき作ったscreenをアタッチします.

修正前

s () {
    if [ -n "$1" ]; then
	name="$1"
    else
	name=`ruby -e 'puts Dir.pwd.split("/").last'`
    fi
    screen -x $name || screen -r $name || screen -S $name

pwdの最後のディレクトリを取得する方法が分からなかったので,rubyで取得していました.
これはよくない感じです.

修正後

s () {
    name=${1:-${PWD##*/}}
    screen -x $name || screen -r $name || screen -S $name
}

修正前のものが,以下のように修正されています.

  • Rubyで処理していたものが,Bash的に処理されている
  • 引数の有無もBash的に処理されている($1か,そうでなければ,PWD##*/

##*/というのが,なんたら/を最長一致で消去する,という処理だそうです.

補足

いま横にいたid:birdie7さんによると,これはBシェル系のみ有効で,Cシェル系では動かないそうです.
気をつけてください.

まとめ

いまの若い人はシェルとかにはあまり興味がなく,しょうもないこともRubyPerlなどで書いてしまいがちですが,古い技術を学ぶことで身につくこともあるのだということを学びました.
ベンチマークを取ったわけではないのですが.ディレクトリを取るためだけにRubyを使わなくなったのは,ナイスだと思います.
id:mollifierさん,id:birdie7さん,ありがとうございました.