文書の過去の版を表示しています。
Shell
Bシェル系、Cシェルは知らん。
操作
- Ctrl-A カーソルを先頭に移動
- Ctrl-E カーソルを末尾に移動
- Ctrl-Z 中断(fgまたはbgで再開)
- Ctrl-R コマンド履歴検索
- Ctrl-C fgプロセスにinterrupt
- Ctrl-D stdinからの入力を終了
バックグラウンドで実行
$ command &
fgでフォアグラウンドに移動、Ctrl-Zで中断、bgでバックグラウンド実行に移動
リダイレクション
コマンド実行時の標準出力と標準エラー出力は、いずれもディスプレイ(コンソール画面)。出力先を切り替えるには > を使う
$ command 1>/dev/null 2>&1
「commandを実行、1(標準出力)の出力先を/dev/nullに、2(エラー出力)の出力先を1と同じに」という意味。
間違いの例として以下のようなものがある
$ command 2>&1 >/dev/null
これは「commandを実行、2の出力先を1(シェルの画面)と同じに、1の出力先を/dev/nullに」という意味になる。
1と2を変数だと思えば分かりやすい。
$ command 1>/dev/null 2>&1 #リダイレクション処理 # var _1 = "コンソール画面へのディスクリプタ" # var _2 = "コンソール画面へのディスクリプタ" # _1 = File.open "/dev/null" # _2 = _1 #結果 # _1 => /dev/nullに書かれる # _2 => /dev/nullに書かれる
間違いの例その2
$ command 1>a.txt 2>a.txt
これは意図通りに動かない。標準出力と標準エラー出力が a.txt への書き込みを行うファイルディスクリプタを別に開くのでお互いに上書きし合ってしまう。2>&1であれば既に標準出力のリダイレクト先として開いているファイルディスクリプタを標準エラーの出力先にセットするので共存可能になる。
なお
$ command 1>a.txt 2>&1
は
$ command &>a.txt
または
$ command >&a.txt
と書く事もできる。
いろいろ小技
ImageMagicでフォルダ内の画像を全部処理
for i in *; do convert ${i} -resize x130 "x_${i}"; done
空白の入ったファイル名も上手い事やってくれるようにする
find * -maxdepth 0 -print0 | xargs -0 -i convert {} -resize x130 "x_{}" # 引数の場所指定
指定の文字列を持つファイルを探す
grep Hogehoge -nrH ./lib
.svnフォルダを削除
find . -name ".svn" -exec rm -rf {} \; find . -name ".svn" | xargs rm -rf
複数ファイルの文字列を一括置換 hoge → fuga の例
grep hoge -rl ./ | xargs sed -i "s/hoge/fuga/g" ag hoge -l | xargs sed -i "s/hoge/fuga/g"
シェル変数の加工
指定位置で切り取り
$ var=abcdefg $ echo ${var:1:4} bcde
変数の値の先頭・末尾でマッチした部分を削除する
$ var=hogehogefugafuga $ echo ${var#hoge} hogefugafuga $ echo ${var%fuga} hogehogefuga $ echo ${var#h*e} hogefugafuga $ echo ${var##h*e} fugafuga $ echo ${var%f*a} hogehogefuga $ echo ${var%%f*a} hogehoge
*をワイルドカードとして使用可能、%%、##は最長マッチとなる。
文字列置換
$ echo ${var/hoge/HOGE} HOGEhogefugafuga $ echo ${var//hoge/HOGE} HOGEHOGEfugafuga
使用例:まとめてリネーム、拡張子を外す
$ ls a.php.txt b.php.txt c.php.txt $ for i in `ls`; do mv $i ${i%.txt}; done $ls a.php b.php c.php
名前付きパイプ
ファイルシステム上の特殊なファイルを介してプロセス間で入出力をやり取りすることができる。
シェルセッション1で以下を実行し、標準入力に適当な値を入力(Ctrl-Dで終了)
$ mkfifo /tmp/foobar $ while read line; do echo $line; done > /tmp/foobar hogehoge fugafuga
シェルセッション2で以下を実行すると、シェルセッション1で入力した結果を受け取れる。シェルセッション1側でCtrl-DするとEOFが送られてcatコマンドが終了する。
$ cat /tmp/foobar hogehoge fugafuga
名前付きパイプを使い終わったらrmで破棄
$ rm /tmp/foobar
普通のファイル感覚で使用すればよい
プロセス置換
あるプロセスの標準入出力をファイルのように扱う。標準入出力でデータを受け取れないコマンドでも一時ファイルが要らなくなる
$ vi <(git blame hogehoge)
プロンプトのカスタマイズ
PS1という変数にフォーマットを入れる
PS1="\h:\W \u\$ "
色付け。以下のいずれか
PS1="\[^[[0;32m\]\h:\W\ \u\$\[^[[m\] " PS1="\[\e[0;32m\]\h:\W\ \u\$\[\e[m\] "
^[
は ^と[の組み合わせに見えるが、実際は Ctrl-v Ctrl-[
で入力できる1つの特殊文字。
\e[0;32m が緑色、\e[m は色指定の解除。これらは\[と\]で囲む必要がある。囲まなくても色が付くが表示がバグる
code | style | color |
---|---|---|
\e[0;30m | normal | black |
\e[0;31m | normal | red |
\e[0;32m | normal | green |
\e[0;33m | normal | yellow |
\e[0;34m | normal | blue |
\e[0;35m | normal | magenda |
\e[0;36m | normal | cyan |
\e[0;37m | normal | white |
\e[1;30m | bold | black |
\e[1;31m | bold | red |
\e[1;32m | bold | green |
\e[1;33m | bold | yellow |
\e[1;34m | bold | blue |
\e[1;35m | bold | magenda |
\e[1;36m | bold | cyan |
\e[1;37m | bold | white |