ユーザ用ツール

サイト用ツール


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 = 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.backup -e "s/hoge/fuga/g"
ag hoge -l | xargs sed -i.backup "s/hoge/fuga/g"
  

バックアップを作らずに置換

grep hoge -rl ./ | xargs sed -i -e "s/hoge/fuga/g"  # GNU
grep hoge -rl ./ | xargs sed -i "" -e "s/hoge/fuga/g"  # BSD

名前付きパイプ

ファイルシステム上の特殊なファイルを介してプロセス間で入出力をやり取りすることができる。

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

スタイル

codestyle
0normal
1bold
4underline
5blink
7reverse
8hidden

codecolor
30black
31red
32green
33yellow
34blue
35magenta
36cyan
37light grey
90dark grey
91light red
92light green
93light yellow
94light blue
95light magenta
96light cyan
97white

背景色

codecolor
40black
41red
42green
43yellow
44blue
45magenta
46cyan
47light grey
100dark grey
101light red
102light green
103light yellow
104light blue
105light magenta
106light cyan
107white

エイリアス

alias ls='ls -G'

エイリアスを一時的に無効化

\ を付けて実行する

\ls

トラブルシューティング

行ごとに表示がずれている

stty sane
shell.txt · 最終更新: 2023/03/15 14:32 by nullpon