/Linuxコマンド

基本

シェルの基本

パイプ・リダイレクト・ワイルドカード・クォート・変数など、どのコマンドにも共通する書き方。

コマンドはシェル(bash や zsh)が読み取って実行します。ここに書いた書き方は、どのコマンドと組み合わせても使えます。

コマンドの形

bash
コマンド [オプション] [引数...]
$ ls -l --human-readable /var/log
  • オプションは動きを変える指定です。-l のような1文字の短い形と、--human-readable のような長い形があります。
  • 短いオプションはまとめて書けます。ls -l -a -h と ls -lah は同じ意味です。
  • 値を取るオプションは -n 5、-n5、--lines=5 のどれでも書けることが多いです。
  • -- のあとは、- で始まっていてもオプションではなく引数として扱われます(rm -- -file.txt)。

パイプとリダイレクト

書き方意味
a | ba の出力を b の入力に渡す(パイプ)
a > file出力をファイルに書き込む(上書き)
a >> file出力をファイルの末尾に追記する
a < fileファイルの中身を入力にする
a 2> err.logエラー出力だけをファイルに書き込む
a > out.log 2>&1通常の出力とエラー出力をまとめて書き込む
a &> out.log上と同じ(bash / zsh の短い書き方)
a > /dev/null出力を捨てる
a | tee file画面に出しつつファイルにも書き込む
bash
$ ls /etc | grep ssh                 # ls の結果から ssh を含む行だけ
$ dmesg > boot.log 2>&1              # 出力もエラーもまとめて保存
$ echo "export EDITOR=vim" >> ~/.bashrc
$ sort < names.txt > sorted.txt

コマンドをつなぐ

書き方意味
a ; ba のあとに b を実行する(成否は問わない)
a && ba が成功したときだけ b を実行する
a || ba が失敗したときだけ b を実行する
a &a をバックグラウンドで実行する
( a; b )サブシェルでまとめて実行する(cd などの影響が外に残らない)
$(a)a の出力をその場に埋め込む(コマンド置換)
bash
$ mkdir -p build && cd build
$ ping -c1 example.com >/dev/null || echo "つながらない"
$ echo "今日は $(date +%F) です"
$ (cd /tmp && tar czf ~/tmp.tgz .)   # 実行後もカレントディレクトリは元のまま

ワイルドカード(グロブ)

書き方一致するもの例
*0文字以上の任意の文字列*.log
?任意の1文字file?.txt
[abc]括弧内のどれか1文字img[0-9].png
{a,b}列挙したそれぞれに展開(ブレース展開)cp app.{conf,conf.bak}
{1..5}連番に展開mkdir day{1..5}
**サブディレクトリも含めて一致(bash は shopt -s globstar が必要)ls **/*.go
bash
$ ls *.{jpg,png}
$ cp config.yaml{,.bak}    # config.yaml を config.yaml.bak にコピー
$ touch log_{01..12}.txt

クォートとエスケープ

書き方意味
'...'中身をそのまま扱う。$ も展開しない
"..."空白をまとめて1つの引数にする。$変数 や $(...) は展開する
\直後の1文字の特別な意味を消す
bash
$ echo '$HOME'        # → $HOME
$ echo "$HOME"        # → /home/alice
$ rm "my file.txt"    # 空白を含むファイル名はクォートする

変数と環境変数

bash
$ name=world               # = の前後に空白を入れない
$ echo "hello, $name"
$ export PATH="$HOME/.local/bin:$PATH"   # 子プロセスにも引き継ぐ
$ LANG=C date              # そのコマンドだけ環境変数を変える
$ echo $?                  # 直前のコマンドの終了コード(0 が成功)
変数意味
$HOMEホームディレクトリ
$PATHコマンドを探すディレクトリの一覧(: 区切り)
$PWDカレントディレクトリ
$USERユーザー名
$SHELLログインシェル
$?直前のコマンドの終了コード
$$今のシェルのプロセスID
$!最後にバックグラウンドで起動したプロセスのID

履歴と入力の補助

操作意味
Tabコマンド名・ファイル名を補完する。2回押すと候補を一覧表示
↑ / ↓履歴をさかのぼる
Ctrl+R履歴を検索する(続けて押すとさらに前へ)
!!直前のコマンド(sudo !! で直前のコマンドをsudo付きで再実行)
!$直前のコマンドの最後の引数
history履歴の一覧

キー操作

キー動作
Ctrl+C実行中のコマンドを止める
Ctrl+Z実行中のコマンドを一時停止する(fg で再開)
Ctrl+D入力の終わり。空の行で押すとシェルを抜ける
Ctrl+L画面をクリアする(clear と同じ)
Ctrl+A / Ctrl+E行頭 / 行末へ移動
Ctrl+U / Ctrl+Kカーソルより前 / 後ろを削除
Ctrl+W直前の単語を削除
Alt+.直前のコマンドの最後の引数を貼り付ける

よく使う組み込みコマンド

echo文字列を表示する

文字列を画面に表示します。

bash
$ echo "hello"
$ echo -n "改行なし"
$ echo -e "タブ\tと\n改行"    # バックスラッシュのエスケープを解釈する

printf書式を指定して表示する

echo より動きが環境に左右されにくく、スクリプトではこちらが確実です。

bash
$ printf "%s さんは %d 歳\n" "Alice" 20
$ printf "%05.1f\n" 3.14159     # → 003.1

aliasコマンドに別名を付ける

よく使うコマンドに短い別名を付けます。

bash
$ alias ll='ls -lah'
$ alias gs='git status'
$ unalias ll

長く使う別名は ~/.bashrc(zsh は ~/.zshrc)に書いておきます。

source設定ファイルを今のシェルで読み込む

設定ファイルを今のシェルに読み込みます。.bashrc を変えたあとの反映に使います。

bash
$ source ~/.bashrc      # 変更した設定をすぐ反映する
$ . ./venv/bin/activate # 「.」は source と同じ

export環境変数を設定する

環境変数を設定して、このあと実行するコマンドにも引き継ぎます。

bash
$ export EDITOR=vim
$ export -p            # エクスポートされている変数の一覧

historyコマンド履歴

これまでに実行したコマンドの履歴を表示します。

bash
$ history | tail -20
$ history | grep docker
$ !123                 # 履歴の123番を再実行

clear画面を消す

画面の表示を消します。

bash
$ clear