ユーザ用ツール

サイト用ツール


shell

文書の過去の版を表示しています。


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 = "/dev/null"
# _2 = _1
#結果
# _1 => /dev/null
# _2 => /dev/null

いろいろ小技

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 は色指定の解除。これらは\[と\]で囲む必要がある。囲まなくても色が付くが表示がバグる

codestylecolor
\e[0;30mnormalblack
\e[0;31mnormalred
\e[0;32mnormalgreen
\e[0;33mnormalyellow
\e[0;34mnormalblue
\e[0;35mnormalmagenda
\e[0;36mnormalcyan
\e[0;37mnormalwhite
\e[1;30mboldblack
\e[1;31mboldred
\e[1;32mboldgreen
\e[1;33mboldyellow
\e[1;34mboldblue
\e[1;35mboldmagenda
\e[1;36mboldcyan
\e[1;37mboldwhite
shell.1391595200.txt.gz · 最終更新: 2014/02/05 10:13 by nullpon