【コマンドライン初心者向け】知ると捗る基本的なショートカット+Tips

## はじめに
この記事は[Linkbal Advent Calendar 2020](https://qiita.com/advent-calendar/2020/linkbal)の24日目の記事です。

昨日の記事は、昨年と一昨年に引き続きリンクバルで一番プログラミングできると私が思っている方の「[CANVASの内容をHTTP通信だけでライブ配信する💃💃💃](https://qiita.com/laineus/items/ee6c67d3a283090bf2d2)」です。

・・・

クリスマスイブだ。やったね！！！

どうも、キンチキです。

この記事では、コマンドライン初心者が知っておくと捗るUnix系の基本的なショートカット（というよりキーバインドといったほうが正しい？）やコマンドの使い方を紹介します。

ただし、個人的に「コマンドラインを初めて使った日に誰かに教わったり自分で気づく」と感じるものは紹介しません。
例えば、「カーソルキー↑で一つ前のコマンド表示」や「`ctrl+c`でフォアグラウンドの処理を強制終了」などです。

また、私はいまだにカーソルキーでカーソル移動をしているので、カーソルキーの代わりになるショートカットも紹介しません！

意外と知らないものがあるかもしれませんので、よかったらコマンドラインnot初心者の方もご覧ください。


## 動作確認環境
- OS: macOS Catalina Version 10.15.7
- ターミナルソフト: iTerm2 Build 3.4.3
- シェル: zsh 5.8 (x86_64-apple-darwin19.3.0)
- zshrc: https://github.com/kinchiki/dotfiles/blob/master/.zshrc

ターミナルソフトの違いはコマンドラインの動作にはほぼ関係ないと思います。
OSもUnix系やLinux（=POSIX準拠？）なら変わらないかと。

シェルの種類やバージョンによってはもしかしたら動作が異なるものがあるかもしれませんが、よく使われてそうなbashやzshなら問題ないでしょう。

## 紹介するもの一覧
- `cd` だけでホームディレクトリに戻る
- `cd -` で一つ前のディレクトリに戻る
- `ctrl+d` でカーソル位置から後方の文字を削除
- `ctrl+u` でカーソル位置から前方の文字をすべて削除
- `ctrl+k` でカーソル位置から後方の文字をすべて削除
- `ctrl+w` でカーソル位置から単語削除
- `ctrl+y` で `ctrl+u` , `ctrl+k` , `ctrl+w` で削除した文字のペースト
- `ctrl+a` で行頭へ移動
- `ctrl+e` で行末へ移動
- `ctrl+r` でコマンド履歴からインクリメンタル検索 進む
- `ctrl+s` でコマンド履歴からインクリメンタル検索 戻る
- `ctrl+l` で画面クリア
- `source` コマンドで設定ファイルを読み込む

ではいきます。

## cd
### `cd` だけでホームディレクトリに戻る
知らずに `cd ~` と打っていた方、これを使いましょう！

### `cd -` で一つ前のディレクトリに戻る
深いディレクトリまで一気に行ったらこれをどうぞ。

## 文字削除＆ペースト
### `ctrl+d` でカーソル位置から後方の文字を削除
widnowsでいうdeleteキー。

なにも入力されていない状態ではログアウトされます。
ログアウトは、sshしているときや、他のシェルを起動しているとき、それらをやめるときに使います。

### `ctrl+u` でカーソル位置から前方の文字をすべて削除 ※
bashだとカーソル位置から前方にある文字だけ**多分**消します。
zshだとカーソルがどの位置にあっても**多分**全て消します。

「多分」と書いているのは、私のzshの設定などでデフォルトの挙動から変わっているかもしれず、自信がないからです。

使いどころは多く、特にパスワードを間違えたときに使えます。
コマンドライン上でのパスワードは、何文字打ったか、何文字消したかわかりません。
このショートカットを知らないと、パスワードを打ち間違えたときにbackspaceをとにかく連打して文字を全部消しますが、`ctru+u`なら一発かつ確実に全文字消えています。

### `ctrl+k` でカーソル位置から後方の文字をすべて削除
そのまま。コマンド履歴からパスやオプションだけ消したいときなどにどうぞ。

### `ctrl+w` でカーソル位置から前方の単語削除
Macでいうoption+deleteです。

コマンド履歴のパスからディレクトリ一つ分消すなど、使いどころは多いです。

### `ctrl+y` で `ctrl+u` , `ctrl+k` , `ctrl+w` で削除した文字のペースト
上記3つのコマンドで消した文字をペーストできます。

例えば以下の使い方などができます。

コマンドの入力順序を間違えたことに入力中に気づいた
→ `ctrl+u`で消す
→ 本来のコマンドを打つ
→ 途中まで入力してたコマンドを `ctrl+y` でペーストする

## カーソル移動
### `ctrl+a` で行頭へ移動
WindowsでいうHomeキーやMacでいうcmd+←と同じ。

### `ctrl+e` で行末へ移動
WindowsでいうEndキーやMacでいうcmd+→と同じ。

## 検索
### `ctrl+r` でコマンド履歴からインクリメンタル検索 進む
入力した文字でコマンド履歴を検索します。
`ctrl+r` を押すたびに、ヒットするコマンドを遡ります。

[peco](https://github.com/peco/peco)というコマンドライン向けのツールを使うことを強く勧めます。

参考記事

[pecoる - Qiita](https://qiita.com/tmsanrinsha/items/72cebab6cd448704e366)

### `ctrl+s` でコマンド履歴からインクリメンタル検索 戻る
`ctrl+r` でどんどん履歴を進んで、「いきすぎた！もっと前（未来）だった」みたいなときに使います。
コマンド履歴から、検索結果に出ていたコマンドより未来に入力されたものを検索します。

`ctrl+r` で過去に進みすぎたコマンド履歴から元の位置に戻っていく、という説明がわかりやすいでしょうか？
表現が難しいですね。

`ctrl+s` を押すたびに、履歴を戻ります。

bashだと `ctrl+s` はデフォルトだとスクリーンロックという機能に割り当てられているらしいので、 `~/.bashrc` などに以下を書きましょう。

```.bashrc
if [ "$SSH_TTY" != "" ]; then
        stty stop undef
fi
```

参考記事

- [逆引きUNIXコマンド/Ctrl+Sによる端末ロックを無効にする方法 - Linuxと過ごす](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/Ctrl%2BS%E3%81%AB%E3%82%88%E3%82%8B%E7%AB%AF%E6%9C%AB%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [ctrl+rで進みすぎたとき反対向きに進むにはctrl+s at softelメモ](https://www.softel.co.jp/blogs/tech/archives/5616)


## その他
### `ctrl+l` で画面クリア
`clear` コマンドと同じ。あちらより打つのが楽。

### `source` コマンドで設定ファイルを読み込む
`$source ~/.zshrc` とすると `~/.zshrc` を読み込みます。

使いどころは、シェルの設定ファイルを編集した後に、ターミナルを開き直したり新規タブを開いたりせずに、編集内容を現在のシェルに反映させるときです。

シェルの設定ファイルをいじるときは便利です。
いじっているときは頻繁に使うと思うので、aliasを登録しておくと楽です。

```.zshrc
alias sz='source ~/.zshrc'
```

`source` コマンドは、ファイルに書かれたコマンドを現在のシェルで実行するコマンドらしいです。

参考

- [【 source 】コマンド／【 . 】コマンド――シェルの設定を即座に反映させる：Linux基本コマンドTips（169） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1712/21/news015.html#:~:text=%E3%80%8Csource%E3%80%8D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB,%E3%81%97%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
- [Linux — source コマンドは何をしているのか > 実は環境をリロードするためのものではない - Qiita](https://qiita.com/YumaInaura/items/00437e6ab14d96adb71f)


## おわりに
おわりません。

・・・

最後に、初心者向けかつコマンドラインの話で、この記事と近いジャンルのなので一つ宣伝します。

「デフォルトのターミナルの見た目がダサくてをなんとかしたい！」って方は、拙著ですが以下の（半分ネタ）記事をどうぞ！

[お前らのターミナルはダサい - Qiita](https://qiita.com/kinchiki/items/57e9391128d07819c321)

それでは良いクリスマスイブをお過ごしください！