この記事について
「Efficient Linux コマンドライン」を読んだ際、学びになったことについて自分用に整理しておきます。
個人的にはCDPATHとBashのTab補完を利用するが面白かったので、聞いたことがない人はぜひご覧ください。
入力と出力のリダイレクト
記法 | 説明 |
---|---|
1> | stdoutのリダイレクト |
2> | stderrのリダイレクト |
&> | 両方をリダイレクト |
以下例
#include <stdio.h>
int main(void) {
printf("stdout\n");
fprintf(stderr, "stderr\n");
return 0;
}
$ ./test 1> stdout.txt
$ ./test 2> stderr.txt
評価を無効にする
記法 | 説明 |
---|---|
'' | 範囲内の全てを文字として扱う |
"" | いくつかの記号を除いて範囲内の全てを文字として扱う |
\ | バックスラッシュの次にある文字を文字通りに扱う |
例えば「$HOME」はシングルクオートでは文字列として表示され、ダブルクオートではホームディレクトリとしてシェルに展開されます。
例
$ echo "$HOME"
/home/user
$ echo '$HOME'
$HOME
CDPATH
(追記: @ko1nksm さんよりexport
は不要とのご指摘を頂きまして、修正しました。)
.bashrcかなんかに環境変数としてCDPATHを追記することで、普段使いする深いディレクトリへと簡単に移動ができます。個人的にはこれがとても面白く、GitHubにある.bash_personalとgcdp(ホームディレクトリ配下のディレクトリと、ホーム上のディレクトリを絶対パスとして文字列で返すシェルスクリプト)なども参考にしてみてください。
#.bashrcなどへ追加するスクリプト
CDPATH=行きたいディレクトリへの絶対パス
例えばあなたが
/home/user
にいるとして、その配下にある
/home/user/dir1/dir2/dir3 ぐらいに進みたいとしたら
愚直にパスを手打ちするのではなく、
CDPATH=/home/user/dir1/dir2/dir3
と.bashrcに追記して読み込ませることで
$ pwd
/home/user
$ cd dir3
$ pwd
/home/user/dir1/dir2/dir3
こう出来るのです。
効率よくディレクトリへ戻る
記法 | 説明 |
---|---|
cd - | 移動する直前のディレクトリへ戻る |
pushd | 現在いるディレクトリをスタックへプッシュし、指定したディレクトリへ移動する |
popd | スタックからディレクトリをポップし、かつそこへ移動する |
dirs | ディレクトリのスタックを見る |
例
$ pwd
/home/user
$ pushd /home/user/dir1/
~/home/user/dir1/ ~/home/user
$ dirs
0 ~/home/user/dir1
1 ~/home/user
$ popd
~/home/user
リストに関するテクニック
記法 | 説明 |
---|---|
&& | 2つ目のコマンドの実行は1つ目のコマンドに依存している |
|| | 1番目のコマンドが失敗したら、2つ目のコマンドを実行する |
; | 単に順番に実行する |
例
# dir1への移動が成功したらnew.txtを生成する
$ cd dir1 && touch new.txt
# dir1への移動が失敗したらエラーを吐く
$ cd dir1 || echo "failed to change dir"
# 単にnew.txtを生成した後に、helloを表示させる
touch new.txt ; echo "hello"
プロセス置換
記法 | 説明 |
---|---|
<() | ()の中にコマンドを記述することで、そのコマンドの実行結果(stdin)がファイルのように扱える |
例
# diffはファイルを要求するのでこう書ける
# 結果は何もない(文字列が同じなので)
# あるプログラムの実行結果をファイルに書き込んでdiffするより、echoの部分をあるプログラムに置き換えると便利
$ diff <(echo "Hello") <(echo "Hello")
プロセス制御に関するテクニック
記法 | 説明 |
---|---|
& | 実行するプログラムの最後につけると、標準出力がプロンプトへ出力されなくなる(バックグラウンドで動く) |
bg | &をつけたプログラムはctrl+zで一時停止可能。そしてbgで再開できる |
fg | バックグラウンドで動いているプログラムをフォアグラウンドへ戻す(標準出力が出てくるようになる) |
例
# GUIなアプリケーションをコマンドから起動すると、そのコマンドに入力できなくなるため、その解決などに使用する。
# keepassxcはただの例
$ keepassxc &
BashのTab補完を利用する
簡単に言えば、.bashrc内の関数やその他シェルスクリプトへの補完を有効化することで、実行時にTabによる入力の補完を行うことができるというものです。有効化するにはcomplete
コマンドを使用するよう、シェルの起動時に確実に読み込まれるファイル(.bashrcなど)へ追記しておく必要があります。
詳しくはGitHubにあるページも参考にしてみてください。
最後に
- 間違えていた場合にはご指摘ください。
- 他にも様々なテクニックが記されていましたが、個人的にためになったというかすぐ使えて面白かったものだけを書きました。
- 実は他にもgrepや正規表現、awkやsedなどの基本にも触れられていたのですが、こちらはこれらをより深く扱った書籍などを参考にするべきだとのことです。