Linux (やUnix)でコマンドを実行する際、複数のコマンドを組み合わせてより複雑な事をしたりある記号が特殊な役割を持っている事が良くあるので知ってる物をまとめてみます。というより Evernote の奥底に眠っていたので引っ張りだしてみた。記号の類ってぐぐりにくいんですよねぇ。。。
リダイレクト
コマンドの出力結果を他のコマンドやファイルなどに出力したりします。上の2つ以外はあんまり使わないんですけどね。
> は書き出し, >> は追記
1 は標準出力, 2 は標準エラー出力
というルールは覚えておくと捗ると思う。
hoge < file | 標準入力を file から読み込む |
---|---|
hoge > file | 標準出力を file に書き出す |
hoge 2> file | 標準エラー出力を file に書き出す |
hoge >file 2>&1 | 標準出力と標準エラー出力を file に書き出す |
hoge >> file | 標準出力を file に追記 |
hoge 2>> file | 標準エラー出力を file に追記 |
hoge >> file 2>&1 | 標準出力と標準エラー出力を file に追記 |
hoge 2>&1 | fuga | 標準出力と標準エラー出力をコマンド fuga の標準入力に渡す |
パイプ
リダイレクトの一つだけど別にした。
コマンドの標準出力を別のコマンドに受け渡せる。よく使いますね。
コマンドを渡す先は less, xargs, grep, sort, uniq とか多いです。
例
$ ls -alt | head -n 5
total 24212
drwxrwxr-x 30 ryomatsu ryomatsu 4096 Jun 7 00:47 .
-rw------- 1 ryomatsu ryomatsu 65467 Jun 7 00:47 .histfile
drwx------ 2 ryomatsu ryomatsu 4096 Jun 5 18:09 .w3m
-rw------- 1 ryomatsu ryomatsu 12090 Jun 5 09:54 .mysql_history
# 複数繋げれる
# /wp/archive/ へのアクセスかつステータスコードが 200 じゃないものを tail -f で表示
$ tail -f /var/log/apache2/loumo.jp.access_log | grep 'req:GET /wp/archive/' | grep -v 'status:200'
複数コマンドの同時実行
複数のコマンドを実行する際に一つ前のコマンドの状況により次のコマンドを実行するかとか指定できます。
; と & 以外はシェルスクリプト書く時ぐらいかなぁ使うの。
hoge ; fuga | hoge が終わったら fuga を実行 |
---|---|
hoge & | hoge をバックグラウンドで実行 |
hoge && fuga | hoge が成功したら fuga を実行 |
hoge || fuga | hoge が失敗したら fuga を実行 |
他細々としたもの
~
ホームディレクトリを示す。cd ~/ で自分のホームディレクトリに戻ったりしますね。
~hoge のように ~ の後にユーザ名をつけるとそのユーザのホームディレクトリとなります。
$ pwd
/etc/apache2/conf.d
$ cd ~/
$ pwd
/home/ryomatsu
cd -
cd の後に - をつけると直前にいたディレクトリに移動できる。ブラウザの戻るなどと違ってずっと戻るとかできないので cd - を連打すると同じディレクトリを行ったり来たりする事に。
$ cd /etc/apache2/conf.d/
$ cd ~
$ pwd
/home/ryomatsu
$ cd -
/etc/apache2/conf.d
$ cd -
~
$_
直前に打ったコマンドの最後の引数を返す。ls で確認してから作業のためにそのディレクトリに移動するとか。
$ ls -alt ~/bin/
...
$ cd $_
$ pwd
/home/ryomatsu/bin
\
所謂エスケープ。改行をエスケープして複数行にまたがるコマンドを書いたり特殊な文字を含むファイルを操作したりする。
$ ls \
hoge \
fuga
$ ls -l hoge\ fuga
-rw-rw-r-- 1 ryomatsu ryomatsu 0 Jun 7 18:59 hoge fuga
``
コマンドを実行して、その結果を返します。返ってきた結果を他のコマンドの引数にしたりします。
# ls -t /var/log/example/* の一行目の値を tail -f で表示する。ファイル名に日時が入ってるなどでよく変わる場合に使います。
$ tail -f `ls -t /var/log/example/* | head -n 1`
にしても自分で使わないものは全然覚えてなくて良くないなぁ。。。