#contents


*日本語関連 [#kaaea255]
**表示と入力 [#lfc21201]
.inputrc に以下のように書いておけば日本語の直接入力と表示が出来る。
 set convert-meta off
 set meta-flag on
 set output-meta on

**その他 [#rdda814c]
-ls で日本語表示が ? となってしまうのは --show-control-chars オプションを付ける。

**LANGと違う文字コードで grep する [#u0ea48bf]
こんなのを .bashrc とかで定義しとけば便利。
 grepSJIS () { WORD="$1"; shift; LANG=ja_JP.SJIS grep "`echo $WORD|lv -Os`" "$@"; }
 grepUTF8 () { WORD="$1"; shift; LANG=ja_JP.UTF-8 grep "`echo $WORD|lv -Ou8`" "$@"; }
 grepEUC () { WORD="$1"; shift; LANG=ja_JP.ujis grep "`echo $WORD|lv -Oej`" "$@"; }
 egrepSJIS () { WORD="$1"; shift; LANG=ja_JP.SJIS egrep "`echo $WORD|lv -Os`" "$@"; }
 egrepUTF8 () { WORD="$1"; shift; LANG=ja_JP.UTF-8 egrep "`echo $WORD|lv -Ou8`" "$@"; }
 egrepEUC () { WORD="$1"; shift; LANG=ja_JP.ujis egrep "`echo $WORD|lv -Oej`" "$@"; }
ホントは lgrep とかが一番日本語で grep が完璧だと思う。
ただ、lgrep って -r とか使えないんだよなぁ(--;


*補完機能強化 [#c9825db6]
**bash-completion [#ecfb179b]
complete という組み込みコマンドで補完機能を自分で強化できるようになる。
自分で一つずつ便利だと思う補完機能を作って言っても良いのだが、bash-completion という色々な補完機能の詰め合わせパッケージがあるので、
これをインストールするだけでかなりの恩恵が受けられるようになる。

例えば cd と入力して tab を打つとディレクトリのみが補完されるようになったりしますよ。

-[[./自作補完機能]]

**コマンド履歴補完を賢くする [#xc3577aa]
~/.inputrc に以下のように書いておくと、例えば s と入力した状態で C-p を押すと s で始まるコマンド履歴が補完されるようになります。
 "\C-n":history-search-forward
 "\C-p":history-search-backward


*スクリプト等で役立つもの [#hdb238a7]
**シェル変数 [#l830c82c]
以下はスクリプトで良く使うもの。それ以外は [[man>http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbAU]] を参照。
|CENTER:||c
|0|プログラム名|
|1〜9|第1〜9引数|
|@|全ての引数。"$@" としたときは "$1" "$2" "$3"... に等しい。|
|*|全ての引数。"$*" としたときは "$1 $2 $3..." に等しい。|
|#|引数の数|
|?|直前に実行したプログラムの終了コード。|
|RANDOM|ランダムな数字。0〜32767 が帰ってくる模様。|
|$|プロセスID|


**変数の展開方法色々 [#v46ef504]
bash には実に様々な変数の展開方法が用意されている。
あまり多用すると分かりにくいスクリプトになってしまう恐れがあるが、
知っていると結構便利なことがある。
|CENTER:形|CENTER:説明|CENTER:実行例|CENTER:結果|h
|${'''変数''':-'''デフォルト値'''}|'''変数'''が空なら'''デフォルト値'''を表示する。|HOGE=abc; echo ${HOGE:-AIUEO}&br;unset HOGE; echo ${HOGE:-AIUEO}|abc&br;AIUEO|
|${'''変数''':'''offset'''}|'''変数'''の'''offset'''以降の部分文字列を表示する。|HOGE=abcde; echo ${HOGE:2}|cde|
|${'''変数''':'''offset''':'''length'''}|'''変数'''の'''offset'''から'''length'''文字の部分文字列を表示する。|HOGE=abcde; echo ${HOGE:2:2}|cd|
|${'''変数'''#'''パターン'''}|'''変数'''の先頭から最短一致でマッチした'''パターン'''を削除する。|HOGE=hoge.tar.gz; echo ${HOGE#*.}|tar.gz|
|${'''変数'''##'''パターン'''}|'''変数'''の先頭から最長一致でマッチした'''パターン'''を削除する。|HOGE=hoge.tar.gz; echo ${HOGE##*.}|gz|
|${'''変数'''%'''パターン'''}|'''変数'''の末尾から最短一致でマッチした'''パターン'''を削除する。|HOGE=hoge.tar.gz; echo ${HOGE%.*}|hoge.tar|
|${'''変数'''%%'''パターン'''}|'''変数'''の末尾から最長一致でマッチした'''パターン'''を削除する。|HOGE=hoge.tar.gz; echo ${HOGE%%.*}|hoge|
|${'''変数'''/'''パターン'''/'''置換後'''}|'''変数'''内の'''パターン'''に最初にマッチした文字列を'''置換後'''に置換する。|FOO=foo.foo.gz; echo ${FOO/foo/bar}|bar.foo.gz|
|${'''変数'''/'''パターン'''//'''置換後'''}|'''変数'''内の'''パターン'''にマッチした文字列を全て'''置換後'''に置換する。|FOO=foo.foo.gz; echo ${FOO//foo/bar}|bar.bar.gz|
|${'''変数'''//'''パターン'''/'''置換後'''}|'''変数'''内の'''パターン'''にマッチした文字列を全て'''置換後'''に置換する。|FOO=foo.foo.gz; echo ${FOO//foo/bar}|bar.bar.gz|
例えば拡張子を変えるのに使ったりとかできる。
 FNAME=hoge.jpg
 echo ${FNAME%*.jpg}.png
とか。

参考:http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbAZ


**シェルの組み込みコマンド [#f9423cdb]
以下はスクリプトで良く使うもの。それ以外は [[man>http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbCW]] を参照。
|CENTER:||c
|:|何もしないで終了コード 0 を返す。while : ;do '''…''';done のように無限ループさせるのによく使う。|
|. '''filename'''|'''filename''' で指定されたファイルを読み込んで中に書かれたコマンドを現在の環境で実行する。include のイメージ。|
|break ['''n''']|ループのを抜ける。'''n''' を指定すると '''n''' レベル外のループを抜ける。|
|continue '''[n]'''|ループの次の繰り返し分から実行を継続する。'''n''' を指定すると '''n''' レベル外のループで実行を継続します。|
|read ['''name ...''']|標準入力から 1 行読み込み、最初の単語を最初の '''name''' に代入し、2 番目の単語を 2 番目の '''name''' に代入します。'''name''' が指定されなかったら REPLY に代入される。|
|exec '''command''' ['''arguments''']|現在のシェルはこの '''command''' に置き換えられます。新しいプロセスは生成されません。exec 以降のスクリプトが実行されることはありません。|
|exit ['''n''']|ステータス '''n''' でシェルを終了させる。|
|return ['''n''']|ステータス '''n''' で関数を終了する。|
|export '''name'''[='''word'''] ...|'''name''' を環境変数に設定します。'''word''' が指定された場合は環境変数 '''name''' に '''word''' が設定されます。|


**ジョブが終了するのを待つ [#iec7aa41]
foo& bar& とかでバックグラウンドジョブを作成した後に、それらが全て終了するのを待つ方法。
-その1(フィルタを適当に変えれば柔軟に利用可能)
 wait $( jobs -l | perl -pe's/.*\s+([0-9]+) Running .*/$1/' )
-その2
 while wait %% 2>/dev/null; do :; done


**一時ファイルを作らずにコマンド出力をファイルのように扱う [#q3cb39b5]
以下のようにすると一時ファイルが必要そうな処理を、一時ファイルを作らずに行うことが出来ます。
 diff <(ssh host cat file) <(ssh host cat file)
この機能の名前をプロセス置換という。

**一時ファイルを確実に削除する方法 [#v441eaab]
以下のような感じで trap を利用することで途中でスクリプトが中断された場合でも一時ファイルの削除が行えるようになります。
但し当然 KILL などで殺された場合はその限りではありません。
 #!/bin/sh
 prog_name=$( basename "$0" )
 tmp_file="/tmp/$prog_name.`date +%S`.$$"
 
 # クリーンナップ関数
 function end_by_signal {
     rm -f "$tmp_file"
     exit
 }
 # トラップ設定
 trap end_by_signal EXIT HUP INT QUIT TERM ABRT
 
 # 一時ファイルに何か保存
 echo hoge > "$tmp_file"
 
 #以下適当

**yを入力させて実行の最終確認を行う(安全装置) [#hc4744e3]
以下の1行をスクリプトの頭に書いておけばよい
 read -p 'Are you sure? [y/N] ' -t10 k && test "x$k" == "xy" || exit 1

**よく使うコマンド [#u84f3c8c]
-timeout
-env
-test
-sleep

*プロンプト [#e508adf4]
色の定義。

 DEFAULT=$'\e[00m'
 GRAY=$'\e[1;30m'
 LIGHT_GRAY=$'\e[0;37m'
 WHITE=$'\e[1;37m'
 LIGHT_RED=$'\e[1;31m'
 LIGHT_BLUE=$'\e[1;36m'
 YELLOW=$'\e[1;33m'
 PURPLE=$'\e[1;35m'
 GREEN=$'\e[1;32m'
 BLUE=$'\e[1;34m'

ssh経由の接続の場合プロンプトを変化させるようにする。
 case ${SSH_CLIENT:-"DontUseSSH"} in
 "DontUseSSH" ) PS1=$GREEN'>'$GREEN'> '$DEFAULT ;;
 *            ) PS1=$GREEN'>'$GREEN'>'$LIGHT_RED'> '$DEFAULT ;;
 esac
 


*便利な自作関数/エイリアス [#hcabb95d]

//勝手に追加します。なんかあったら消してかまいません。by 通りすがりD
**タイトルに現在のディレクトリを表示 [#g50d7fec]
たとえば/usr/share/man/man1であれば/usr/.../man1と表示される。
さらに$HOMEは~に変換される。

 case $TERM in              
         xterm*|rxvt*|Eterm)
         PROMPT_COMMAND='echo -ne "\033]0;[$(pwd | sed "s#^$HOME#\~#;s#^\(\~*/[^/]*/\).*\(/[^/]*\)#\1...\2#")]\007"'
         ;;
         screen)
         PROMPT_COMMAND='echo -ne "\033k[$(pwd | sed "s#^$HOME#\~#;s#^\(\~*/[^/]*/\).*\(/[^/]*\)#\1...\2#")]\033\\"'
         ;;
 esac


*コメント [#ed2bac4c]
-自分で便利だと思っているものを勝手に追加しました。問題あれば消してください --  &new{2006-03-25 (土) 07:42:36};
-通りすがりに誤字を見つけたので直しておきました。 -- [[Zefard]] &new{2006-07-03 (月) 17:59:15};
- [[./自作補完機能]] に適当にメモを残してみよう --  &new{2006-12-13 (水) 22:21:33};
- ”cd - ” -- [[一つ前のディレクトリに移動]] &new{2007-01-08 (月) 12:41:57};

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS