🔍

which と type の違い、あと適当に wch を作った

2021/08/01に公開

ライトな一発ネタ。

which

jq インストールしてあったっけ? みたいなときによく使うやつ。

$ which jq
/usr/local/bin/jq

探したいものはいろいろある問題

jq なら話は簡単なんだけど、探したいものっていろいろ種類があるんだよね。

インストールしたコマンド

$ which jq
/usr/local/bin/jq

自分で書いたスクリプト

$ which clc
/Users/xxx/xxx/xxx/apps/calculator/bin/clc

自分で書いた関数

$ which take
take () {
  mkdir -p $1
  cd $1
}

( bash だとこれすら出ない、さっき知った。)

ビルトインの処理

$ which cd
cd: shell built-in command

探したいというよりは、叩いたらそうだったって感じ。

( bash は /usr/bin/cd っぽい。)

ない

$ which foo
foo not found

探してからどうするのさ問題

僕は割と which xxx だけだとやりたいことが終わらない場合が多い。

jq のあるディレクトリってほかに何入ってんだ?」とか

$ which jq
/usr/local/bin/jq

# ( お、そこか... )

$ ls /usr/local/bin
bla bla bla

take の実装いじりたいんだけど、これどこに書いたっけ?」とか

$ which take
take () {
  mkdir -p $1
  cd $1
}

# ( スクリプトじゃあなくて関数にしたんだっけ... どこだっけ... )

自分の Mac を触っていて「入れたっけ?」って動機で which をやることってあんまりない気がするんだよね。

type

which の使い方を調べてたら type なるコマンドを知った。

which よりいろいろ探せる

ちなみにシェル非依存なので type なら bash も同じ結果になるはず。

インストールしたコマンド

$ type jq
jq is /usr/local/bin/jq

自分で書いたスクリプト

$ type clc
clc is /Users/xxx/xxx/xxx/apps/calculator/bin/clc

自分で書いた関数

$ type take
take is a shell function from /Users/xxx/xxx/xxx/zsh/command.zsh

イケてる。

ビルトインの処理

$ type cd
cd is a shell builtin

ない

$ type foo
foo not found

適当に type をベースに代替 which を作った

wch

めちゃ適当に which の替わりに使う wch を作った。

function wch() {
  result=`type $1`

  if [ "`echo $result | grep 'not found'`" ]; then
    echo 'not found'
  elif [ "`echo $result | grep 'shell builtin'`" ]; then
    echo 'shell built-in'
  else
    found=`echo $result | rev | cut -d ' ' -f 1 | rev`
    dir=`dirname $found`
    if [ $# = 1 ]; then
      echo $found
    elif [ $2 = 'ls' ]; then
      ls $dir
    elif [ $2 = 'dir' ]; then
      echo $dir
    elif [ $2 = 'cd' ]; then
      cd $dir
    elif [ $2 = 'vi' ]; then
      if [ "`file $found | grep 'ASCII text'`" ]; then
        vi $found
      else
        echo 'not a text'
      fi
    fi
  fi
}

wch jq cd みたいに使う。

別に which で ↓ みたいにすればいいじゃんって?

$ cd `dirname $(which jq)`

脳内が「jq 探して... 移動して...」って語順なんだから、コマンドも左から書きたいのさ。

挙動未指定

which 風味。実際は type ベース。

$ wch jq
/usr/local/bin/jq
$ wch take
/Users/xxx/xxx/xxx/zsh/command.zsh

関数の実装が知りたいことはあんまりないので、パスを出すことにした。

ls とか cd はイメージする通り

$ wch jq cd

$ pwd
/usr/local/bin
$ wch take ls
command.zsh option.zsh

dir はディレクトリを表示

$ wch jq dir
/usr/local/bin

dirname $(which jq) はめんどうだけど、ディレクトリをパイプに渡したいことがあるかも。

vi もイメージする通り

$ wch take vi
bla bla bla
$ wch jq vi
not a text

適当に file でチェックして開そうなやつだけ開く。

ほか、適当にガード

$ wch foo
not found
$ wch foo ls
not found
$ wch cd vi
shell built-in

結論

超適当なので使ってたら問題が出たり使わなくなったりするかもしれない。

楽しかったのでよし。

Discussion