🔍
which と type の違い、あと適当に wch を作った
ライトな一発ネタ。
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