zshのプロンプトにIPアドレスを表示したい

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

必要動作

  1. IPアドレスを表示 : 当然ですね
  2. 複数OSに対応 : ディストリビューションの違いとかMacとかにも
  3. わかりやすい内容 : あとから編集するの面倒だしね

といった動作が必要だなあと。

誰かやってるような気がするけど、まあ初投稿だしこんなもんでいいか(

OS判定

上の必要動作の順番と違いますが、まあいいです。
2番目のやつを実現するためにos.shなどというスクリプトを作りました。
内容は非常に単純で、unameからOSを判定するだけです。
で、そのあとIPアドレスを読み込むスクリプトを実行します。

.os.sh
#!/bin/sh

if [ `uname` = "Darwin" ] 
then
    ~/.zsh.d/ipaddr_m.sh
elif [ `uname` = "Linux" ]
 then
    ~/.zsh.d/ipaddr_l.sh
fi

IPアドレス読込

Mac OS X

筆者は、Macbook AirとiMacを使っているため、IPアドレスの取得を考えないといかんのですよね。

OS Xでは、ifconfigとうつとNICはen*で表現されるため、それの取得をどちらにするかがまた面倒なのよね。
筆者の環境ではこうなっています。

  • iMac
    • en0 : 有線
    • en1 : 無線(通常は使わない)
  • Macbook Air
    • en0 : 無線
    • en2 : 有線(USB Ethernet Adapter)

今回、Thunderbolt Ethernet Adapterは調査してません!
基本的には、有線のほうを優先(笑)しています。
そのため、ifconfig からen2があるかどうかを調査する必要が出てきます。
で、3行目がそれです(これって行番号出せれないの?)。
en2があるなら表示、ないならen0を表示。
iMacについては基本的にはen0のみを利用します。

ipaddr_m.sh
#!/bin/sh

ifconfig | grep en2 > /dev/null

if [ $? -eq 0 ]
then
    ifconfig en2 | grep -v inet6 | grep inet | cut -f 2 -d':' | cut -d' ' -f 2
 else 
    ifconfig en0 | grep -v inet6 | grep inet | cut -f 2 -d':' | cut -d' ' -f 2
fi

Linux

Linuxはsshで接続するのみなので、てきとーです。
環境がどうなってるのかわからんので、条件分岐もテキトーです。
わかったら直す予定。あくまで予定

ipaddr_l.sh
#!/bin/sh

if [ `/sbin/ifconfig | grep eth1`]; then
    /sbin/ifconfig eth1 | grep inet | grep -v inet6 | cut -f 2 -d':' | cut -d' ' -f 1
else 
/sbin/ifconfig eth0 | grep inet | grep -v inet6 | cut -f 2 -d':' | cut -d' ' -f 1
fi
hoge

.zshrc

プロンプト設定は気にせずに…
ipという変数に./os.shの出力結果(ipaddr_*.shの出力結果)を格納して、それを出力します。
簡単ですね。

.zshrc

ip=`~/.zsh.d/os.sh`

# プロンプト設定
PROMPT="
[%n@%m($ip)] %{${fg[yellow]}%}%~%{${reset_color}%}
%(?.%{$fg[green]%}.%{$fg[blue]%})%(?!ζ*'ヮ'%)ζ <! ζ*;ヮ;%)ζ <)%{${reset_color}%} "

SPROMPT="%{$fg[red]%}%{$suggest%}ζ*'ヮ'%)ζ? < もしかして %B%r%b %{$fg[red]%}ですか? [うっう〜!(y), うっう〜!(n),a,e]:${reset_color} "