【学習メモ】LinuxCUI初心者が早く知りたかったコマンド(操作も)

#はじめに
Linuxを学ぶ上で
先に教えて欲しかったことを書きます。
つまりは、教える機会があれば先に伝えておきたいことです。

便利なキー操作や誤りがあればぜひ教えてください。
また、この記事に対して[morimorihogeさんの分かりやすい補完](https://techracho.bpsinc.jp/morimorihoge/2017_07_30/43974)がありますので、ぜひそちらと合わせてお読みください

#流れ
1.キーボード操作編
　知ってると便利なショートカット。
2.用語・概念編
　知ってるとひらめくかも。
3.コマンド編
　知っておくべき重要なコマンド、時短になるコマンド。

#キーボード操作編
###補完機能
Tab連打。
連打すると勝手にlsしてフォルダ内のファイル一覧を教えてくれる。
候補が絞られると勝手に名前を補完してくれる。
###入力間違いでもBackspaceやDeleteできない
^H^H^Hや^[[3~、^[[Dが表示されて涙目。
Ctrl + U で入力したものがきれいに消える。
パスワードを間違って入力したときにも使える。
###入力した履歴は↑キーしか使ったことがない
ひたすら↑を押さずに、Ctrl + R で入力した履歴を検索できる。
historyコマンド、ヒストリリスト/root/.bash_history。
ターミナルは[常にヒストリリストを emacs で編集していて，コマンドラインはその最終行](http://se.cite.ehime-u.ac.jp/~aman/memo/bash/command_line.html)。
キーワードを入れてCtrlを押しながらR連打で履歴を遡れる。
###フリーズしたCtrl+Cも受け付けない
viで編集中によくやる。
Ctrl + Sで画面のロック、Ctrl + Qでロック解除。
ただしロック中に入力した内容は全部実行されているので注意。
[vimで操作ができなくなったら･･･](http://interu.hatenablog.com/entry/20080327/1206550010)
###仮想デスクトップ切り替えのような
プログラム実行中に終わるまで待つ必要がなくなる。
フォアグラウンドとバックグラウンドがある。
Ctrl + Zで実行中の[ジョブ](http://www.infraeye.com/study/linuxz17.html)を一時停止してバックグラウンドへ移行
jobsでバックグラウンドのジョブ一覧表示
fg X でXのジョブをフォアグラウンドへ移行
bg X でXのジョブをバックグラウンドのまま再開
[実行中のプログラムをバックグラウンドにもっていく。フォアグラウンドにもってくる（bg、fg）](http://kazmax.zpp.jp/linux_beginner/jobs_fg_bg.html)
コマンド行の末尾に&をつけると、はじめからバックグラウンドで実行できる。([できないものもある](http://qiita.com/tajima_taso/items/c5553762af5e1a599fed))
### bash入力のショートカットキー
下記記事の「Emacs」のショートカット。
[Bash(Zsh)上でよく使うカーソル移動などのショートカットを覚えると得する話(qiita.com/kamykn)](https://qiita.com/kamykn/items/5b7f3c3eb41a3549bb4e)
#用語・概念編
###バッシュって何？
bash、sh、シェル…シェルスクリプト？
似た名前で区別がつかないけど、
入力したコマンドを一次請けして、OSに渡してくれるプログラムをシェル。bashやzshなどの種類がある。
シェルの違いはcmdとpowershellのような感じ。
コマンドプロンプトのような入力窓~~をシェル~~は[ターミナル。](http://qiita.com/tadsan/items/441dcd910537d3f408e5)
SSH接続やログイン後、ユーザーごとのシェル(bash等)が起動し、OSへ伝えるコマンドの入力を待っている。
[Linux上でシェルが実行される仕組みを，体系的に理解しよう（bash 中級者への道）](http://language-and-engineering.hatenablog.jp/entry/20110617/p1)
###標準出力？
[root@hoge ~]#　の世界で表示されるものは
「デバイスファイル(tty)に入出力された文字情報」
という衝撃。
ファイルに出力された文字だから
パイプしたりリダイレクトしたりできる。
↓の7～22までを10回読むと何となくわかるかも。
["シェル芸初心者によるシェル芸入門"](https://www.slideshare.net/icchyr/ss-52341962)
###SSH接続が切れたから同じptsにつなぎなおしたい
できない。
SSH接続が切れる->使用していた**[デバイスファイル(/dev/pts)](http://piyopiyocs.blog115.fc2.com/blog-entry-663.html)を削除**->SSHが起動させたbashを終了->bashが起動させたスクリプトが終了。(順序は前後しているかもしれません)
SSHが切れる＝終了させるのと同義なので、再接続＋動作中だったプログラムを再開できない。
解決するプログラムは[仮想デスクトップ切り替えのような#2](http://qiita.com/Hige-Moja/items/44bbfb14868816169978#%E4%BB%AE%E6%83%B3%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA2)を参照
プログラムを[もう既に実行してしまった場合でも切れる前なら大丈夫](http://qiita.com/koudaiii/items/26d7bef49706556e4188#%E3%82%82%E3%81%86%E6%97%A2%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88)
###シェルスクリプト
バッチファイルと同じ。見たことない文法。ifがfiで終わる、不思議な世界。
覚えればそんなに難しくない。
シェルで動くコマンドを書くので、シェルを使えないと書けない。
スペースが区切り文字の意味を持つので
[シェルスクリプトを文法ではなく、長いコマンドラインとして捉え](http://shellscript.sunone.me/tutorial.html)れば
シェルスクリプトで出るSyntax Errorは減るはず。
###/etcや/dev
/etcはWindowsで例えるならWindowsフォルダ。設定ファイルがたくさん入っている。
/devはデバイス関連をファイル化したものが入ってるフォルダ。
ルートディレクトリ / 以下のフォルダに何が入ってるかは
[大体決まってるらしい。](https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)
###pid？
プログラムが動作してるとpidファイルをlog等のフォルダに作成する。
このファイルがあると、起動中とみなされる。
###ソケット SOCK SOCKET
プログラムがデータをやり取りするために使われる特殊なファイル。
mysql.sockが何かわからず詰まった。[SOCKETの歴史](http://research.nii.ac.jp/~ichiro/syspro98/socket.html)。
###$
変数を表す。シェルだと$$はそれ自身のPID。
シェルスクリプトで$?は直前の実行コマンドの結果。
$1は1つ目の引数、$2は2つ目の引数。
###行末の\\(バックスラッシュ)
改行文字の直前にバックスラッシュが出たら、
改行していないと思って次の行を読む。
[論理行が複数の物理行にまたがる場合に、行の継続を表すために用いる。](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5#.E3.82.A8.E3.82.B9.E3.82.B1.E3.83.BC.E3.83.97)
###エイリアス
打ったコマンドは実は引数が設定されることもあるらしい。
grepの色分けもそのおかげ。
aliasコマンドでで確認できる。
set -xを実行したあと、コマンドを打つたびに引数が見れる。
set +xで戻る。
コマンドの組み合わせを登録することもできる。
###プロセスの親子関係
sysinit/systemdが一番はじめにある。
その下に子プロセスが関係をもって起動する。
プログラムはすべて親子関係があり、親がいなくなると子もいなくなる。
親が異常終了すると、子はsystemdに引き取られて生き続けることもある。
[Systemd入門(1) - Unitの概念を理解する](http://enakai00.hatenablog.com/entry/20130914/1379146157)
bashから入力したプログラムはbashの子として動作している。
#コマンド編
###man
["マニュアルコマンドman、infoや関連コマンドについて整理する"](http://eno0514.hatenadiary.jp/entry/20150824/1440355912)
###ll
ls -l と同じ。llがls -lと同じ動作をするalias設定がされている。
エクスプローラーのようにディレクトリの中身が見れる。
そのままでは動かないLinuxもある。
隠しファイルも見たいときはls -la。
###less
ファイルに追記された末尾を見たいとき less -> Shift + F (Ctrl + Cで抜ける、vで編集も可能)
[tail -fやtailfでもできる](https://hydrocul.github.io/wiki/commands/tail.html)
[ログファイルなどの追記出力をリアルタイムに見るには](https://hydrocul.github.io/wiki/commands/howto/tail-f.html)
[tail -fは「ctrl + S」で一時停止、「ctrl + Q」で再開させる。](http://did2memo.net/2013/04/23/how-to-pause-tail-f/)
tail -f は複数ファイルも見れるのでlessと使い分けると良い。tail -f /home/apache/logs/*$(date +%Y%m%d) 等。
###cat awk sed cut sort wc
パイプしたいときに使う魔法の言葉。
それぞれの文法は覚えるべし。
###find
ファイルを探す。/で探せば大体見つかる。find -name XXX
locateのほうが早く探せる。[インストールはmlocate。](http://www.plan0213.com/blog/67/)
###ps
ps auxでプロセスが見れる。
ps コマンドにfをつけるとツリー化する。pstreeコマンドでもツリー状、pstree -pでプロセスIDも見れる。
pstreeはCentOS7標準で無いっぽいので[入れる](http://qiita.com/todanano/items/f421c237eaa2d9adff04)
###top
タスクマネージャー。
負荷確認に便利。
["LoadAverage(ロードアベレージ)について"](http://qiita.com/toshihirock/items/c121400dd58c5d77f85a)
["load averageを見てシステムの負荷を確認する"](http://qiita.com/k0kubun/items/8065f5cf2da7605c8043)
top画面でhを押せばヘルプ。
CPUに余裕はあるのに遅いときはCpu(s)の行のwaを見る。IO待ち。
###curl
HTTP接続できるか確認できる。
apacheの起動確認に便利。
###which
起動するプログラムがどこのフォルダにある(PATHが通っている)かわかる。
シェルスクリプトの絶対パスを書くときに便利。
###ip a
IPアドレスを調べたいときにifconfigと長く打たなくて済む。
###yes
~~びっくりする。~~
[CPUを1コア100%使用率にする](https://techracho.bpsinc.jp/morimorihoge/2017_07_30/43974)
###w
一文字でもコマンド。
誰がログインしてるかわかる。
LoadAverageも見れる。
###cd -
cdで移動する前のディレクトリに移動できる。
###du -sh / df -h
du -shカレントの使用量。
df -hディスクの情報を見る。
### vi(vim)の操作
キーボードのショートカットを早いうちに覚えた方が良いです。
移動系:^(行頭)、$(行末)、G(ファイル末尾)、w(次の単語)
操作系:u(undo)、:%s/a/b/gで置換、yyでコピって(ddで切り取って)pで挿入、.(前の作業を繰り返す)
マクロ:qa -> (内容) -> q -> @a (aというマクロ名を作って実行)


#追加
###仮想デスクトップ切り替えのような#2
screen tmux [byobu](https://www.google.co.jp/search?q=byobu+centos+install)
現在の接続とは別に、別に新しく接続する。
["Linux screenコマンド使い方"](http://qiita.com/hnishi/items/3190f2901f88e2594a5f)
[どれも画面を分割して使える](http://kanjuku-tomato.blogspot.jp/2014/02/tmux.html)。

思い出したら追記していきます。

#あとがき
-この記事の方針-
Linuxを知らず触り始めて間もない期間に、
皆さまが日常使っているキーボードの妙技を
知っていれば…という思いで記事(備忘)化を思い立ちました。

書いているうちに、具体的なコマンドやシステムも書きたくなりました。
LAMP環境を入れたり、ログを追って問題を解決したり、
目的に沿う作業や操作を覚えていくうえで、
topコマンドやsocketの概念、標準入出力の知識も、
初めからなんとなくでも知ってれば遠回りが減ったかなと思い、書き足しています。
また、始めたてでWindowsメインだった自分に伝えることを考え、ざっくりと書くつもりでした。（Aliasやなど知らない部分がたくさん教えていただいて助かります）
誤解を招く部分(/etcが/windows)もありますので、注釈は加えようと思います。
項目が正確・詳しくなると量が増え、他のコンテンツとあまり変わりがなくなると思いますので、
触り始めの2、3日から1、2週間に知りたかった内容に絞りたいと思っています。

以下の構成で各項を記述し、脱【学習メモ】できるよう修正していきたいと思っています。（別記事にするかもしれません）
1.具体的な内容（Tab補完、ll）
2.調べるキーワード（historyコマンド、エイリアス）
3.しくみ（bash-emacs、alias）

2018/09/03
インフラエンジニアとして1年が経過しました。
上記記事のCtrl+Zは使わず新しくSSHで接続しています。
ファジーなWindows脳が抜けず、トラブル発生時にとりあえずアプリの再起動をしようとしてしまい、ログを見ることを忘れてしまうことがよくあります。