読者です 読者をやめる 読者になる 読者になる

なぁんか、タイプが違うんだよ。

tech zsh

...初めて知りました。

type コマンド、
zshbash かで、違いがあると言うこと。特にオプションの使い方。

Innovation - internal or external?
Innovation - internal or external? / Tsahi Levent-Levi

簡単にオプションと キーワード "と思われる" ところを。
よしゃあーいいのかもしれませんが、自分の言葉で。

zsh についてtype [ -wfpams ] name ...

  • -w (word ?)
    "name: word" の形式で結果を出力。
    word には型が出力。word の バリエーションは、;
    • alias
    • builtin
    • command
    • function
    • hashed*1
    • reserved
    • " "*2
  • -f (function ?)
    シェル関数の内容を出力。
  • -p (path ?)
    パスを出力する。
  • -a (all occurrences of name ?)
    型に関わらず、全てのアイテムを出力。
  • -m (pattern matching ?)
    引数は括弧で囲むことで探索キーワードのパターンとなり、それにマッチするアイテムを探索し出力。
  • -s (symlinks ?) シンボリックリンクだったら、その参照先も出力。

ちょっと心配... 認識違い、誤記ありましたらご指摘下さい。何卒。

ちなみに bash についてでしたら type [-aftpP] name [name ...]

  • -a (all ?)
    型などに関係なく、name の全てのアイテムを出力。
  • -f (suppresses shell function lookup ?)
    シェル関数は処理の対象外とする。
  • -t (type ?)
    型を出力。型のバリエーションは、;
    • alias
    • keyword*3
    • function
    • builtin
    • file*4
    • " "*5
  • -p (path ?)
    パスのみを出力。何か "name is" ってのが付かない。だけど型が file じゃない、つまり 組み込みコマンドbuiltin とかだったら何も出力しないみたい。
  • -P (Path ?) -p 同様パスのみ出力。しかし、こちらは -p のようなスカシはしない。

こんなところでしょうか。

当パラグラフでの参照先です。;

きっかけ

shellscript 内で、幾つかのコマンドのパスを取得したいと考えた。

これには type コマンドをチョイス。*6

ところが、この type、「惜っしいなぁ」思うところがひとつあって、
出力結果が、which のようにパスだけでなく、" is .." という形をとってくる。

勿論、awk とか使えば良いのは分かるのですが...
と思うたびに、そんなオプションとかなんかあったりしないもんだか、と冗談と期待半々で、ボンヤリと "ついでに" な検索で、こちらに出遭った。

» type【コマンド】|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

あるじゃん、思ってターミナル*7で ;

% type eyeD3
eyeD3 is /opt/boxen/homebrew/bin/eyeD3
% type -p eyeD3
eyeD3 is /opt/boxen/homebrew/bin/eyeD3
% type -t eyeD3
zsh: bad option: -t

ここで、この辺りの記述が気になる。

ちなみに「type」コマンドはsh系で使えるコマンドです。csh系では使えないのでご注意ください。

あれ? とは思ったのですがそこは飲み込んで、
自分がログインシェルとして何を使っているか、を気にしてみた。

シェルの問題? ...とか?

% echo $SHELL
/opt/boxen/homebrew/bin/zsh

これのせい?

わたしのタイプじゃなかった、と言うこと

で。

% bash
bash-3.2$ type eyeD3
eyeD3 is /opt/boxen/homebrew/bin/eyeD3
bash-3.2$ type -p eyeD3
/opt/boxen/homebrew/bin/eyeD3
bash-3.2$ type -t eyeD3
file
bash-3.2$ exit
exit
%

とゆ事でした。

あの時の自分から、うっちゃっられてきたアレ

過去幾度かの不可解な経験に、ここでやっと合点がいく。

実は以前にも同じような事をしていて。

過去、
全く別の件でたまたま目にしてきたサイトで、p オプションの存在を偶然知り、「正にコレ!」と type -p name 叩いてみたら、返ってくる結果は結局 name is ...

その時点では、特に深入りすることもなく軽い気持ちで流していたのです。
何か訳有って "そう言うもの" なのだろう、と。

そして今回、
type -t name で「そんなオプションない」と言われた辺りで「あれ」と思って、一歩引いて見てみたら、"そゆこと" でしたと。

過去の自分が、うっちゃった未来の自分と言うのがコレ、ってことね(笑

オチは実に基本的なつまらないところでしたが orz

あん時の自分にこんにちわ、と言うことで、はい、おしまい。

*1:素直に hash されたもので良いみたい。

*2:none。おそらくブランク、何も表示されない。

*3:たぶん、予約語のことだと思います。

*4:実行ファイルのこと。外部コマンドとか?

*5:none。おそらくブランク、何も表示されない。

*6:'which' でも良いじゃん、と言うのもあるのですが、それはこの辺り見ていて、この手のことは 'type' を使うよう心掛けているのと、好奇心から 'type' でやってみることに。;
» shell - How to check if a program exists from a bash script - Stack Overflow
» [How to check if command exists in a shell script - Stack Overflow][11]
» [Bash - コマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 - Qiita][12]

*7:iterm2。