ラベル UNIX の投稿を表示しています。 すべての投稿を表示
ラベル UNIX の投稿を表示しています。 すべての投稿を表示

2010年11月19日金曜日

zsh プロンプト変更

なんとなくプロンプトを変更してみた.

書き方が分かったから今度から自分で変更しよう.

参考にできるのはここ.

zsh:Prompt Expansion

変えたのはこれ

autoload colors
colors
case ${UID} in
0)
    PROMPT="%B%{${fg[green]}%}%n@%m#%{${reset_color}%}%b "
    PROMPT2="%B%{${fg[green]}%}%_#%{${reset_color}%}%b "
 RPROMPT="%{${fg[yellow]}%}[%~]%{${reset_color}%}"
    SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
    ;;
*)
    PROMPT="%{${fg[green]}%}%n@%m %%%{${reset_color}%} "
    PROMPT2="%{${fg[green]}%}%_%%%{${reset_color}%} "
 RPROMPT="%{${fg[yellow]}%}[%~]%{${reset_color}%}"
    SPROMPT="%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
    ;;
esac

結局RPROMPTで右っかわにカレントディレクトリ (%~)を表示させ, 左側にはユーザ名@マシン名 (%n@%m) としました.
時刻とか出してる人もいたけどあんまり必要な情報ではないし... とは言えユーザ名もマシン名も自宅PCであれば意味ないか...

今更聞けないUNIXコマンド (3) 公開鍵認証方式+ssh ログイン

職場、学校等のサーバが公開鍵認証方式を採用している場合は多いです。
その設定を昨日やったので、一応書いておきます。windowsではputtyなんかでやってましたが、macではTerminalから全部できて便利。

まずは

% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tatsuaki/.ssh/id_rsa): 
Created directory '/Users/tatsuaki/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

てなかんじでssh-keygenにより公開鍵, 秘密鍵のペアを生成します.
公開鍵は他人に見られてもオッケーですが、秘密鍵は秘密なのでこれは絶対秘密です.
-t オプションは鍵の種類を設定します. dsaとかありますがデフォルトではrsa2である-t rsaが決まっていて,
これが推奨らしいのでこれでやりましょう.

コマンドを入れるとkeyを作る場所を聞かれるのでいれます. デフォルトで~/.ssh/に入ります.

次にパスフレーズを聞かれるので, パスワードを2回いれます. (これでサーバへ認証します)

% cd .ssh
id_rsa  id_rsa.pub
と2つファイルがあり, id_rsa, id_rsa.pubがありますが, 後者が公開鍵です.
これをサーバへ転送します.

とは言え自分はつながっていないので誰かに頼みましょう. 私の場合は違うマシンで入れたのでそっちへ
メールで送り, そこから設定しました.

ここからはサーバ側の設定です.

サーバへファイルid_rsa.pubを送りましょう. sftpやらscpやら単純にftpやらありますが,
scpでやるならば

$ scp [オプション][転送したいファイル名][転送先のパス]
とします.

たとえば
$ scp test.txt USER1@remotehost.co.jp:.ssh
で手元にあるtest.txtをUSER1としてログインするremotehost.co.jpの~/.ssh/へ送ります.
パスワードを聞かれますので入力すればok. ちなみに, scpは-rオプションでディレクトリを転送します.

サーバ管理者がどうしているか分かりませんが, サーバのユーザホームディレクトリに.sshがあるはずなので,
(なければ作る)

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

でauthorized_keysへ内容を書き込みます. これにて終了.
ちなみに
$ chmod 600 ~/.ssh/authorized_keys
でパーミッションを変更して他から表示できないようにしといた方が安全です.


あとはログインするときは

$ ssh USER1@remotehost.co.jp 

あるいは

$ ssh -l USER1 remotehost.co.jp
で入れます.

あと, 普通にやっていれば公開鍵がユーザの~/.ssh/known_hostsに追加されるはずですが, エラーが出たり
古かったりすると問題です. 書式は以下の通り.

ホスト名, IP  キー種別  ホスト公開鍵
    #  コメント
   例:
    remotehost.co.jp, 192.168.1.2 ssh-rsa AAAAB3NzaC1...nXIDE=.......
改行すれば何個も指定できます.

2010年11月15日月曜日

zshの設定

さらに取り急ぎ, .zshrcおよび.zshenvの設定


.zshenv
PATH=$PATH:$HOME/bin

export PATH

# MacPorts Installer addition on 2010-09-20_at_22:04:26: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.

#Manual PATH
export MANPATH=/opt/local/share/man:$MANPATH


#Hadoop Path
export HADOOP_INSTALL=/Users/tatsuaki/workspace/hadoop-0.21.0
export PATH=$PATH:$HADOOP_INSTALL/bin

LANG=ja_JP.UTF-8
export LANG

LISTMAX=0
export LISTMAX

.zshrc
# 新規ディレクトリは755、新規ファイルは644にする
umask 022


## Default shell configuration
#
# set prompt
#
autoload colors
colors
case ${UID} in
0)
    PROMPT="%B%{${fg[green]}%}%/#%{${reset_color}%}%b "
    PROMPT2="%B%{${fg[green]}%}%_#%{${reset_color}%}%b "
    SPROMPT="%B%{${fg[green]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
    ;;
*)
    PROMPT="%{${fg[green]}%}%/%%%{${reset_color}%} "
    PROMPT2="%{${fg[green]}%}%_%%%{${reset_color}%} "
    SPROMPT="%{${fg[green]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
    ;;
esac



#### 補完  ####
#############

autoload -U compinit
compinit

#ディレクトリ名を入力するだけでカレントディレクトリを変更
setopt auto_cd
#タブキーを何度も押せば補完候補が出る
setopt auto_menu
#自動集積機能
setopt correct
#補完機能を詰めて表示
setopt list_packed
# =以降でも補完できるようにする
setopt magic_equal_subst
#補完候補リストの日本語を正しく表示
setopt print_eight_bit

# 補完の時に大文字小文字を区別しない(但し、大文字を打った場合は小文字に変換しない)
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'


# ビープ音を鳴らさないようにする
setopt no_beep



##history#####
# 直前と同じコマンドラインはヒストリに追加しない
setopt hist_ignore_dups

# ヒストリにhistoryコマンドを記録しない
setopt hist_no_store

# 余分なスペースを削除してヒストリに記録する
setopt hist_reduce_blanks

# 行頭がスペースで始まるコマンドラインはヒストリに記録しない
# setopt hist_ignore_spece

# 重複したヒストリは追加しない
# setopt hist_ignore_all_dups

# ヒストリを呼び出してから実行する間に一旦編集できる状態になる
setopt hist_verify

# 履歴ファイルの保存先
HISTFILE=$HOME/.zsh-history
# メモリ内の履歴の数
HISTSIZE=30000
# 保存される履歴の数
SAVEHIST=100000
# 履歴ファイルに時刻を記録する機能を有効化
setopt extended_history
# 履歴をターミナル間で共有する
setopt share_history




# ディレクトリを水色にする。
export LS_COLORS='di=01;36'

# ファイルリスト補完でもlsと同様に色をつける。
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

# cd をしたときにlsを実行する
function chpwd() { ls }

# ディレクトリ名だけで、ディレクトリの移動をする。
setopt auto_cd





# lsコマンドの補完候補にも色付き表示
#eval `dircolors`
zstyle ':completion:*:default' list-colors ${LS_COLORS}
# kill の候補にも色付き表示
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([%0-9]#)*=0=01;31'



zstyle ':completion:*' list-colors \
    'di=01;34' 'ln=01;36' 'pi=40;33' 'so=01;35' 'ex=01;32' \
    'bd=40;33;01' 'cd=40;33;01' 'su=37;41' 'sg=30;43' 'tw=30;42' 'ow=34;42'
autoload -U compinit
compinit -u

  



##


# Carbon Emacs = cemacs
alias cemacs='open -a Emacs'
alias cemacsn='open  -n Emacs'
alias emacs='/Applications/Emacs.app/Contents/MacOS/Emacs -nw'

#alias#
alias ls="ls -G"
alias rm="rm -i"
alias cp="cp -i"
alias mv="mv -i"

# application alias #
alias firefox="open -a Firefox"
alias prev="open -a Preview"
alias itunes="open -a iTunes"
alias texs="open -a  TexShop"

1時間くらいで拾い集めた情報であるため, 今後更新予定.
とりあえずプロンプトを変えたい.

2010年11月14日日曜日

今更聞けないUNIXコマンド (3) ジョブとプロセス

UNIXにおけるプロセス, とはOSが管理する実行単位です. それに対して, ジョブは複数のプロセスから成る, シェルが管理するプログラムの実行単位になります.

動作中のジョブは

$ jobs
[1]+  Stopped                 gnuplot

のように確認できます. とはいえ, Stoppedでgnuplotは停止中ですね.
Running : 実行中, Killed: 強制終了, Done: 正常終了, Exit: 異常終了などがあります.

フォアグランドジョブというのが, 現在表で実行中のジョブのことですが, 裏で動作する
バックグランドジョブに切り替えることができます.

$ bg %1
[1]+ gnuplot &

[1]+  Stopped                 gnuplot
とこのようにbg %ジョブ番号でバックグラウンドになります. (%注意)

逆にしたければ

$ fg %1
gnuplot

gnuplot>
でフォアグラウンドにできます. ちなみに引数をいれなければデフォルトでStoppedのジョブが選ばれます.

また, プロセス一覧も見ることができます.

$ ps
  PID TTY           TIME CMD
  478 ttys000    0:00.04 -bash
  995 ttys000    0:00.01 gnuplot
  895 ttys001    0:00.01 -bash
ターミナルを2つ立ち上げていたので, bashが二つプロセスとしてあります.
PIDというのはプロセスを管理するプロセス番号です. 試しに消してみましょう.

$ kill 995
$ ps
  PID TTY           TIME CMD
  478 ttys000    0:00.05 -bash
  895 ttys001    0:00.01 -bash
[1]+  Terminated              gnuplot

とまぁgnuplotが終了されました. これはTERMシグナルというものを送っています.
本気で殺したければkill -KILLとKILLシグナルを送ります.

$ kill -KILL 1041
$ ps
  PID TTY           TIME CMD
  478 ttys000    0:00.07 -bash
  895 ttys001    0:00.01 -bash
[1]+  Killed                  gnuplot

これで無事強制終了されました. なお, Kill PID番号でプロセスを, Kill %ジョブ番号でジョブを殺せます.

シグナルは色々あるらしいので, よくわからんのですが, (kill -lコマンドで確認可能)
とりあえず有名なのはHUPシグナルらしいです.

これはネットワークサービスとして動くデーモンに設定ファイルを再読み込みさせるために使います.
ようするに, 何か設定ファイル変えたときに反映させるためですね.

$ ps -axw
で全ユーザプロセスを省略せずに見ることができます. これでプロセス探して,

$ kill -HUP PID
とすることで, 更新させることができます.

なお, 他にkillallコマンドってのがあって, そっちはコマンド名でシグナルを送るそうです.

$ killall gnuplot
$ ps
  PID TTY           TIME CMD
  478 ttys000    0:00.10 -bash
  895 ttys001    0:00.03 -bash
[1]+  Terminated              gnuplot



ps -axwがでてきたのでついでに書くと, topコマンドを使うと, 色んなシステム状態をリアルタイムで見れます.
アクティビティモニタと同じですね. これも全然知らんかった...


ちなみに, 一緒に書くのがいいかわからんが,

$ df -i -h
Filesystem      Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2   298Gi  100Gi  197Gi    34% 26399483 51659343   34%   /
devfs          107Ki  107Ki    0Bi   100%      610        0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0        0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0        0  100%   /home
でディスク使用状況を見れます. -iってのはi-nodeの使用状況も表示, -hってのは
勝手に人が見やすい単位を表示してくれてます.


まぁしかしコマンドってのは死ぬほどあるな. 必要になれば, あるいは人が使ってみるのを見て覚えるしかない.
正直こういったことは覚えたから偉いって訳でもなく, ただ便利だよね, てだけなので必要に応じることが大事だと思います. (初心者が学ぶ姿勢ではないか…)

今更聞けないUNIXコマンド (2) シェル変数について

色々と環境を構築するときにはPATHであったり, なんでもシェル変数がつきまといます.
てわけで簡単な操作をまとめておきます.

代入〜表示〜削除まで

$ age=1
$ echo $age
1
$ unset age
$ echo $age

こんなかんじで, スペースなしで変数へ代入する. echo + $変数名で表示.
unset 変数名で削除を行う. なお, 代入の際文字列なら, "文字列"とする.

組み込みシェル変数

と, さっきのは普通のシェルのユーザが定義する変数でした.
特定の変数は現在の設定などのために使用されるそうです.
そういった組み込みシェル変数を見るには

$ set
Apple_PubSub_Socket_Render=/tmp/launch-E3SrVT/Render
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="48" [3]="1" [4]="release" [5]="x86_64-apple-darwin10.0")
BASH_VERSION='3.2.48(1)-release'
CLICOLOR=1
COLUMNS=100
COMMAND_MODE=unix2003
〜省略

といった具合にsetで見れます.

例えば
$ pwd
/Users/Shared
$ echo $PWD
/Users/Shared
とか.



環境変数

さっきまでのは普通のシェル変数でして, そのシェル内でのみ有効なのですが, 環境変数という
他のプログラムまで影響を及ぼす特別な変数があります. 例えばさっき出てきたPATHやLANGなどがそれです.

環境変数の定義に仕方は

$ export ***
です. 削除は例によってunset.

例えば,

$ echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin:〜
てかんじで中身を見ることができます.

てわけで

$ export PATH=$PATH:/usr/...
てやつは, PATHの中身プラス/usr/...てパスを代入する, という意味があるんですね.
こんな初歩的なことも知らなかったとは切ない.



今ある環境変数一覧は,
$ printenv
MANPATH=/opt/local/share/man:
TERM_PROGRAM=Apple_Terminal
TERM=xterm-color
SHELL=/bin/bash
CLICOLOR=1
TMPDIR=/var/folders/z-/z-li-9WFH48WCuV3k4AIYE+++TI/-Tmp-/
Apple_PubSub_Socket_Render=/tmp/launch-E3SrVT/Render
TERM_PROGRAM_VERSION=273
〜省略
などで見ることができます.

2010年11月7日日曜日

今更聞けないUNIXコマンド (1)

shellの操作も実は素人なもので、覚えたものを随時書いて行きます。

リンク作成

リンクにはディスク内の同じ領域を指し示す「ハードリンク」と元のファイルのパスを記憶する「シンボリックリング」があります。

シンボリックリンクの作成は

ln -s hoge.txt tmp/hoge_sl.txt

のようにlnコマンドに-sオプションをつけて、リンク先、リンク元の順に記述で作成。
注意点としては、相対パスで記述する場合、リンクファイルからの相対パスでできること。
絶対パスで記述すればこういった心配はありませんが...

ハードリンクの場合はオプションをつけずに

ln hoge.txt tmp/hoge_hl.txt

のように記述。

圧縮、解凍

ファイル圧縮
$ gzip test.txt
$ ls
drwxr-xr-x   7 tatsuaki  staff   238 11  7 14:25 .
drwxr-xr-x+ 39 tatsuaki  staff  1326 11  6 11:19 ..
-rw-r--r--@  1 tatsuaki  staff  6148 11  1 23:36 .DS_Store
-rw-r--r--   1 tatsuaki  staff    37 10 11 19:20 test.txt.gz

gzipファイル解凍
gunzip test.txt.gz

これらはファイルに対しての圧縮。
次はアーカイブに対しての圧縮。


圧縮アーカイブ作成
$ tar cvzf test.tgz test
a test
a test/.test.txt.swp

今度は中身を見る
tar tvzf test.tgz

そして展開
tar xvzf test.tgz

ディレクトリを指定したいなら
tar xvzf test.tgz -C tmp/

のように-Cオプション+展開先を指定できます。

ファイル検索

findコマンド
find Documents -name test -type f
Documentsフォルダ内から、名前がtestを探す。-type fでファイルだけを対象にする。

その他オプションは

  • -type:  d (ディレクトリ) f (ファイル) l (シンボリックリンク) 等
  • -mtime N : 最終修正日 +NでN日前より前, -NでN日前より後 
  • -mmin N : N分
  • -size : +-で以上以下
  • -user : ファイルオーナー指定
  • -empty : 空ファイルを探す

-execコマンド
$ find ~ -name *.txt -exec ls -lh {} \;
-rw-r--r--  1 tatsuaki  staff   134B 10 22 16:19 /Users/tatsuaki/test.txt

こんな感じで、-exec コマンド {} ¥;とするとfind結果を引数にしてコマンドできる。
上記例はtxtファイルを探して、それはls -lhしたもの。

lacateコマンド

findは検索に時間がかかるので、あらかじめ全てのファイル/ディレクトリのパスを
登録したlacateコマンドデータベースがあって、そこから検索するほうが早いらしい。

まずはこれを使うためにデータベースを更新。

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
com.apple.locate: Already loaded
と思ったらすでに更新済み。手動でやるなら
sudo /usr/libexec/locate.updatedb
結構時間かかる…

しかし検索は激速

とりあえず一回目はこんな感じで。
おさらい

  • ln : リンク作成
  • tar : アーカイブ圧縮(cvzf)、解凍(xvzf)コマンド。中身はtvzfで閲覧
  • find : 検索。-execオプションで他のコマンドと組み合わせて便利
  • locate : 専用データベースから検策

2010年11月3日水曜日

Terminalの設定

そろそろ会社のmacが到着してしまうので, 備忘録としてせめて家のターミナルの設定を書き出しておきます.

#terminal color
export CLICOLOR=1
export LSCOLORS=Exfxcxdxbxegedabagacad
#
##
# Your previous /Users/tatsuaki/.bash_profile file was backed up as /Users/tatsuaki/.bash_profile.macports-saved_2010-09-20_at_22:04:26
##
#
# MacPorts Installer addition on 2010-09-20_at_22:04:26: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.
#
#
#
#Hadoop Path
export HADOOP_INSTALL=/Users/tatsuaki/workspace/hadoop-0.21.0
export PATH=$PATH:$HADOOP_INSTALL/bin
#
#
# Carbon Emacs = cemacs
alias cemacs='open -a Emacs'
#
#alias#
alias ls="ls -al"
#
# application alias #
alias firefox="open -a Firefox"
alias prev="open -a Preview"
alias itunes="open -a iTunes"
alias texs="open -a  TexShop"


とりあえず取り急ぎexportしたPATHと使っているaliasの設定を。

Terminal.appの設定は以下の通り。


テキスト:
Monaco 14pt
テキストをアンチエイリアス処理
ANSIカラーを表示

詳細:
非ASIⅡ文字をエスケープ
文字エンコーディング=Unicode (UTF-8) 

ウィンドウ:
Proをデフォルトに. 透明度は75%を指定

あとはTerminal_colorを入れました。

全体的に素人が色々とこれから始めるための環境は整ったのではないかと。
これから必要に応じて追加していくかんじで。


aliasの設定法
alias COMMAND=" command_1"
でCOMMAND_1の内容をCOMMANDで実行できるようになる。