Ads

日本語関連

表示と入力

.inputrc に以下のように書いておけば日本語の直接入力と表示が出来る。

set convert-meta off
set meta-flag on
set output-meta on

その他

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

LANGと違う文字コードで grep する

こんなのを .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 とか使えないんだよなぁ(--;

補完機能強化

bash-completion

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

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

コマンド履歴補完を賢くする

/.inputrc に以下のように書いておくと、例えば s と入力した状態で C-p を押すと s で始まるコマンド履歴が補完されるようになります。

"\C-n":history-search-forward
"\C-p":history-search-backward

スクリプト等で役立つもの

シェル変数

以下はスクリプトで良く使うもの。それ以外は man を参照。

0プログラム名
1〜9第1〜9引数
@全ての引数。"$@" としたときは "$1" "$2" "$3"... に等しい。
*全ての引数。"$*" としたときは "$1 $2 $3..." に等しい。
#引数の数
?直前に実行したプログラムの終了コード。
RANDOMランダムな数字。0〜32767 が帰ってくる模様。
$プロセスID

変数の展開方法色々

bash には実に様々な変数の展開方法が用意されている。 あまり多用すると分かりにくいスクリプトになってしまう恐れがあるが、 知っていると結構便利なことがある。

説明実行例結果
${変数:-デフォルト値}変数が空ならデフォルト値を表示する。HOGE=abc; echo ${HOGE:-AIUEO}
unset HOGE; echo ${HOGE:-AIUEO}
abc
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

例えば拡張子を変えるのに使ったりとかできる。

FNAME=hoge.jpg
echo ${FNAME%*.jpg}.png

とか。

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

シェルの組み込みコマンド

以下はスクリプトで良く使うもの。それ以外は man を参照。

:何もしないで終了コード 0 を返す。while : ;do ;done のように無限ループさせるのによく使う。
. filenamefilename で指定されたファイルを読み込んで中に書かれたコマンドを現在の環境で実行する。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 が指定された場合は環境変数 nameword が設定されます。

ジョブが終了するのを待つ

foo& bar& とかでバックグラウンドジョブを作成した後に、それらが全て終了するのを待つ方法。

  • その1(フィルタを適当に変えれば柔軟に利用可能)
    wait $( jobs -l | perl -pe's/.*\s+([0-9]+) Running .*/$1/' )
  • その2
    while wait %% 2>/dev/null; do :; done

一時ファイルを作らずにコマンド出力をファイルのように扱う

以下のようにすると一時ファイルが必要そうな処理を、一時ファイルを作らずに行うことが出来ます。

diff <(ssh host cat file) <(ssh host cat file)

この機能の名前をプロセス置換という。

一時ファイルを確実に削除する方法

以下のような感じで 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を入力させて実行の最終確認を行う(安全装置)

以下の1行をスクリプトの頭に書いておけばよい

read -p 'Are you sure? [y/N] ' -t10 k && test "x$k" == "xy" || exit 1

よく使うコマンド

  • timeout
  • env
  • test
  • sleep

プロンプト

色の定義。

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

便利な自作関数/エイリアス

タイトルに現在のディレクトリを表示

たとえば/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

コメント

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-21 (水) 15:16:42 (1525d)