基本
シェルの基本
パイプ・リダイレクト・ワイルドカード・クォート・変数など、どのコマンドにも共通する書き方。
コマンドはシェル(bash や zsh)が読み取って実行します。ここに書いた書き方は、どのコマンドと組み合わせても使えます。
コマンドの形
コマンド [オプション] [引数...]
$ 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 | b | a の出力を 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 | 画面に出しつつファイルにも書き込む |
$ ls /etc | grep ssh # ls の結果から ssh を含む行だけ
$ dmesg > boot.log 2>&1 # 出力もエラーもまとめて保存
$ echo "export EDITOR=vim" >> ~/.bashrc
$ sort < names.txt > sorted.txtコマンドをつなぐ
| 書き方 | 意味 |
|---|---|
a ; b | a のあとに b を実行する(成否は問わない) |
a && b | a が成功したときだけ b を実行する |
a || b | a が失敗したときだけ b を実行する |
a & | a をバックグラウンドで実行する |
( a; b ) | サブシェルでまとめて実行する(cd などの影響が外に残らない) |
$(a) | a の出力をその場に埋め込む(コマンド置換) |
$ 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 |
$ ls *.{jpg,png}
$ cp config.yaml{,.bak} # config.yaml を config.yaml.bak にコピー
$ touch log_{01..12}.txtクォートとエスケープ
| 書き方 | 意味 |
|---|---|
'...' | 中身をそのまま扱う。$ も展開しない |
"..." | 空白をまとめて1つの引数にする。$変数 や $(...) は展開する |
\ | 直後の1文字の特別な意味を消す |
$ echo '$HOME' # → $HOME
$ echo "$HOME" # → /home/alice
$ rm "my file.txt" # 空白を含むファイル名はクォートする変数と環境変数
$ 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文字列を表示する
文字列を画面に表示します。
$ echo "hello"
$ echo -n "改行なし"
$ echo -e "タブ\tと\n改行" # バックスラッシュのエスケープを解釈するprintf書式を指定して表示する
echo より動きが環境に左右されにくく、スクリプトではこちらが確実です。
$ printf "%s さんは %d 歳\n" "Alice" 20
$ printf "%05.1f\n" 3.14159 # → 003.1aliasコマンドに別名を付ける
よく使うコマンドに短い別名を付けます。
$ alias ll='ls -lah'
$ alias gs='git status'
$ unalias ll長く使う別名は ~/.bashrc(zsh は ~/.zshrc)に書いておきます。
source設定ファイルを今のシェルで読み込む
設定ファイルを今のシェルに読み込みます。.bashrc を変えたあとの反映に使います。
$ source ~/.bashrc # 変更した設定をすぐ反映する
$ . ./venv/bin/activate # 「.」は source と同じexport環境変数を設定する
環境変数を設定して、このあと実行するコマンドにも引き継ぎます。
$ export EDITOR=vim
$ export -p # エクスポートされている変数の一覧historyコマンド履歴
これまでに実行したコマンドの履歴を表示します。
$ history | tail -20
$ history | grep docker
$ !123 # 履歴の123番を再実行clear画面を消す
画面の表示を消します。
$ clear