Linuxについて学んだこと

Linuxについて学んだことをまとめました。
間違っている情報あれば遠慮なくご指摘ください！

# Linuxの種類
|RedHat系|
|:--|
|Red Hat Enterprise Linux|
|CentOS|
|Fedora|

|Debian系|
|:--|
|Debian GNU/Linux|
|Ubuntu|

# 主なターミナルエミュレータ
|Windows|
|:--|
|PuTTY|
|TeraTerm|

|MacOS|
|:--|
|ターミナル|
|iTerm2|

|Linux|
|:--|
|GNOME端末|
|Konsole|


# シェルの種類
|シェル|解説|
|:--|:--|
|sh|AT&Tベル研究所のSteven Bourne氏によって開発されたシェル<br>Bourneシェルと呼ばれたりBシェルと呼ばれたりもする<br>もっとも古くからあるシェル<br>機能は少ない<br>対話的に使うには非常に不便|
|csh|古いシェル<br>Cシェル<br>shに比べ、対話型操作が便利<br>文法がshと大きく異なり、欠陥がある<br>後継でtcshがあるのでほとんど使われない|
|tcsh|cshの後継として開発されたCシェル系のシェル<br>今はあまり使われない|
|bash|shを基本として機能を拡張したシェル<br>shと後方互換性を持つ<br>対話型操作を行う上で十分な機能を持ち、<br>多くのLinux環境でデフォルトのログインシェルとして使われている<br>シェルスクリプトを書くのにも向いている|
|zsh|新しめのシェル<br>bashやtcshを初めとした他のシェルの機能を積極的に取り込み、更に独自の拡張を加えたシェル<br>非常に多くの機能を持つ<br>すべての機能を使いこなすには時間がかかるが、一度慣れれば非常に効率よく作業できるため人気の高いシェル<br>初心者向けのシェルではない|

利用がおすすめされているのはshとの後方互換性のあるbashシェル
tcshやcshを使い始める理由はない
zshは高機能

# 用語
|用語|意味|備考|
|:--|:--|:--|
|ヤンク|ペーストのこと||
|ハードリンク|ファイルに別名をつけること|macやwindowsには恐らくない概念<br>全てのハードリンクが削除されることでそのファイルが削除される|
|シンボリックリンク|macやwindowsで言うショートカットのこと|ショートカット先のファイルが消えると該当のシンボリックリンクはエラーとなる|
|エイリアス|コマンドを使いやすくするための機能|
|ロケール|言語や国、地域などを特定するための識別子||
|外部コマンド|ファイルシステム上に存在するコマンド||
|組み込みコマンド|シェル自体に内蔵しているコマンド||
|環境変数|外部コマンドからも値を参照できるようにした変数||
|パーミッション|アクセス権限を表したもの<br>-rwxrwxrwxのように10文字で表される<br>1文字目は-なら通常ファイル、dならディレクトリ、lならシンボリックリンク<br>2〜4文字目はオーナーのアクセス権限、5〜7文字目はグループのアクセス権限、8〜10文字目はその他のユーザーのアクセス権限を表す<br>rはreadの略で読み取り、wはwriteの略で書き込み、xはexecuteの略で実行を表す||
|プロセス|Linuxカーネルから見た処理の単位。システム全体で一意のIDを持つ||
|ジョブ|シェルから見た処理の単位。シェルごとに一意のIDを持つ||
|チャネル(チャンネル)|channel。データの流れる道||
|stdin|標準入力|入出力チャネルは0|
|stdout|標準出力|入出力チャネルは1|
|stderr|標準エラー出力|入出力チャネルは2|
|リダイレクト|標準入出力先を変更する機能のこと||
|パイプライン|コマンドの標準出力を別のコマンドの標準入力につなぐ|｜(半角)を使う|
|フィルタ|標準入力を入力として受け取り標準出力に出力するコマンド||
|対話型エディタ|エディタでファイルを開いて編集し、保存|
|非対話型エディタ|与えられたコマンドに対する処理を行い、出力|

# 標準のコマンド
|コマンド|意味|備考|
|:--|:--|:--|
|shutdown -h now|シャットダウン|nowの部分は何分後にシャットダウンするかを指定できる<br>nowだと今すぐにという意味|
|shutdown -r now|再起動|nowの部分は何分後に再起動するかを指定できる<br>nowだと今すぐにという意味|
|date|日付を表示する|2020年 10月 25日 日曜日 01:20:18 JST|
|echo|文字列の表示||
|chsh|シェルを切り替える|ログインできなくなる可能性があり、利用は非推奨|チェンジシェルの略|
|reset|ターミナルのリセット||
|printenv|環境変数一覧表示||
|pwd|現在のディレクトリを表示||
|ls -l|現在のディレクトリにあるファイルやフォルダを表示|lsはリストの略|
|mkdir|ディレクトリを作成|-pをつけると一気に深いところまでディレクトリを作成可能|
|rm|ファイル削除||
|rm -r|ファイル+ディレクトリ削除||
|cat|ファイルの中身を表示|con"cat"enateの略<br>連結するという意味|
|cat -n|行番号つきでファイルの中身を表示||
|less|スクロールでファイルの中身を表示|less中の操作<br>f 1画面下にスクロール<br>b 1画面上にスクロール<br>j 1行下にスクロール<br>k 1行上にスクロール<br>1 終了<br>/ 文字列検索<br>  n 次の検索結果に移動<br>  N 前の検索結果に移動|
|cp|コピー||
|mv|ファイル名変更||
|mv|ファイル移動||
|ln|ハードリンクを作成する|ln リンク元 名前|
|ln -s|シンボリックリンクを作成する|ln -s リンク元 名前|
|コマンド --help|コマンドの使い方を表示する||
|man コマンド|オンラインマニュアル上のコマンドの使い方を表示する(ネット接続して見る訳ではない)|man中の操作<br>f 1画面下にスクロール<br>b 1画面上にスクロール<br>j 1行下にスクロール<br>k 1行上にスクロール<br>1 終了<br>/ 文字列検索<br>  n 次の検索結果に移動<br>  N 前の検索結果に移動|
|which|環境変数$PATHが指すディレクトリ配下で一番最初に見つかったコマンドのフルパスを表示する|環境変数$PATHが指すディレクトリ配下を検索している|
|which -a |環境変数$PATHが指すディレクトリ配下にある全てのコマンドのフルパスを表示する|環境変数$PATHが指すディレクトリ配下を検索している|
|変数名=値|変数に値を入れる|var1='test variable'<br>=の左右にスペースをつけてはいけない|
|locale -a|システムで利用可能なロケールの一覧を表示する||
|type コマンド|エイリアスかどうか、組み込みコマンドかどうかを確かめる||
|alias 名前=コマンド|コマンドを名前のエイリアスにする|
|unalias 名前|エイリアスを削除する|
|command コマンド|エイリアスなしでコマンドを実行する|
|\コマンド|エイリアスなしでコマンドを実行する|
|set|変数一覧を表示する||
|unset|変数を削除する||
|set -o オプション名|オプションをONにする|setコマンドのオプションを別途表にまとめた|
|set +o オプション名|オプションをOFFにする|shoptコマンドのオプションを別途表にまとめた|
|shopt -s オプション名 -v オプション名|-sで指定したオプションをONに、-vで指定したオプションをOFFに||
|export シェル変数名|シェル変数名を環境変数として設定する||
|source ファイル名|ファイル内に記述されている内容を、直接コマンドラインで実行する||
|groups|自分が現在どのグループに所属しているかを表示する||
|chmod [ugoa][+-=][rwx]<ファイル名>|シンボルモードでパーミッションを変更する<br><br>[ugoa]<br>u:オーナー<br>g:グループ<br>o:その他のユーザー<br>a:ugo全て(省略するとaになる)<br><br>[+-=]<br>+:権限を追加<br>-:権限を禁止<br>=:指定した権限と等しくする<br><br>[rwx]<br>r:読み取り<br>w:書き込み<br>x:実行|[コマンド]<br>chmod ugo=rw<br><br>[意味]オーナー、グループ、その他ユーザーのパーミッションをrwにする|
|chmod 3桁の8進数 ファイル名|rwx rwx rwxを指定する場合777を指定する||
|su|スーパユーザーに切り替える|スイッチユーザーの略|
|su -|スーパーユーザの環境に初期化して切り替える|-をつけないと環境変数を引き継いでしまってアプリケーションによってはうまく動作しないことがある。通常は-をつけて実行する|
|sudo|スーパーユーザとしてコマンドを実行する|一時的にスーパーユーザとしてコマンドを実行したい場合に利用<br>使えるかどうかは、/etc/sudoersに%wheel ALL=(ALL) ALLと記述されているかどうか<b>※vimで修正してはいけない。visudoコマンドで行うこと</b>|
|visudo|文法エラーをチェックしながら/etc/sudoersを書き換える||
|ps|実行中のプロセスを表示する|x:実行したユーザーの全てのプロセスを表示<br>ux:実行したユーザーの全てのプロセスを詳細情報を合わせて表示<br>ax:すべてのユーザーのプロセスを表示<br>aux:すべてのユーザーのプロセスを、詳細情報を合わせて表示<br>auxww:表示幅を制限せずに全て表示(それ以外はauxと同じ)|
|jobs|ジョブ一覧を表示|-lオプションをつけるとプロセスIDも表示する|
|fg %ジョブ番号|停止中のジョブをフォアグラウンドにする|ジョブ番号を省略するとjobsで+のついたカレントジョブがフォアグラウンドになる|
|bg %ジョブ番号|停止中のジョブをバックグラウンドで実行する|ジョブ番号を省略するとjobsで+のついたカレントジョブがバックグラウンドになる|
|コマンド &|バックグラウンドで実行する||
|kill %ジョブ番号|ジョブを終了する||
|kill プロセス番号|プロセスを終了する|別ユーザーのプロセスは終了できない。ただし、スーパーユーザーはすべてのユーザーのプロセスを終了させることができる|
|kill -シグナル プロセス番号|プロセスに対してシグナルを送信する|シグナルはkillコマンドで利用可能なシグナル一覧としてまとめた|
|コマンド < ファイル|標準入力をキーボードからファイルに変更してコマンドを実行|コマンド ファイルと同じ動作|
|コマンド > ファイル|標準出力を表示端末からファイルに変更してコマンドを実行|ファイルは自動で生成されるのであらかじめ作成しておく必要はなし|
|コマンド > ファイル 2> エラーファイル|標準出力を表示端末からファイルに変更し、標準エラー出力を表示端末からエラーファイルに変更してコマンドを実行||
|コマンド > ファイル 2>&1|標準出力と標準エラー出力をまとめて表示端末からファイルに変更してコマンドを実行|&1は標準出力を指す|
|コマンド >> ファイル|ファイル末尾に追記する形で標準出力を表示端末からファイルに変更してコマンドを実行||
|head|ファイルの先頭から指定した行数だけを標準出力に出力するコマンド||
|tail|ファイルの末尾から指定した行数だけを標準出力に出力するコマンド|-fをつけると追記されるたびに監視する|
|grep|指定した検索パターンに一致する行だけを表示||
|sort|順番に並べ替える||
|uniq|重複した行を取り除く|-cで重複行を数える|
|taq|逆順に出力する||
|wc|行数やバイト数を出力する|行数、単語数、バイト数の順で表示する。-lで行数のみ出力、-wで単語数のみ出力、-cでバイト数のみ出力する|
|du -b|指定したファイルやディレクトリの使用容量をバイトで表示する||
|diff|ファイル比較を行う||
|sed|非対話型エディタを用いてファイルを編集する|スクリプトで正規表現などを用いて行の削除とか置換とかできる||
|awk|スペースで区切られた何番目のデータを表示するかを表示するのに向いている|オークと読む<br>本格的なテキスト処理を行う際にはRubyやPythonなどのスクリプト言語が使われることが多い|


# 特殊なシェル変数
|変数|説明|備考|
|:--|:--|:--|
|PS1|プロンプトに表示される文字列<br>デフォルトだと[\u@\h \W]\$になっている<br>結果は[root@localhost work]# になる|\u:ユーザー名<br>\w:カレントディレクトリ<br>\h ホスト名のうち、最初の.までの部分<br>\d:日付<br>\H:ホスト名<br>\n:改行<br>\t:HH:MM:SS形式の現在時刻<br>\W:カレントディレクトリの末尾のディレクトリ名<br>\\\\\$:rootユーザの場合は#、それ以外のユーザの場合は$<br>\\\\:そのもの|
|PS2|プロンプトで入力待ちとかに表示される文字列<br>デフォルトだと>になってる||
|PATH|シェルがコマンドを探すディレクトリを:区切りで連結した文字列|末尾にディレクトリを追加する場合はPATH="$PATH: ~/bin"のようにする|
|LANG|ロケール。表示する言語や日付の書式が決まる|
|HISTFILE|コマンドライン履歴を保存するファイル名|デフォルトは~/.bash_history|
|HISTFILESIZE|履歴ファイルに保存するコマンドライン履歴の最大行数||
|HISTSIZE|コマンドライン履歴を保存する最大行数||
|HOME|ホームディレクトリ||
|SHELL|ログインシェルのパス||
|PWD|カレントディレクトリ||
|LESS|less実行時に自動で実行されるオプションを表す環境変数|デフォルトは空|

# 操作
|操作|意味|備考|
|:--|:--|:--|
|control+b|カーソルを1つ左へ|bはback(後ろ)という意味|
|control+f|カーソルを1つ左へ|fはforward(前)という意味|
|control+a|カーソルを先頭へ||
|control+e|カーソルを末尾へ||
|escを押してから離しb|カーソルを単語ごとに左へ|bはback(後ろ)という意味|
|escを押してから離しf|カーソルを単語ごとに右へ|fはforward(前)という意味|
|control+w|カーソル位置から左へスペースまで削除||
|control+k|カーソル位置から行末まで削除|
|control+u|カーソル位置から行頭まで削除|
|control+y|ヤンク(貼り付け)|
|control+l|表示文字のクリア|かなりよく使う|
|control+r|コマンドのインクリメンタルサーチ|インクリメンタルサーチ中の操作<br>文字列を入力すると検索<br>control+r 1つ前を検索<br>esc 現在表示されているコマンドを残したまま戻る<br>control+g 検索結果を破棄して戻る|
|control+z|コマンドを停止させる|コマンドを終了させた訳ではなく、fgコマンドで再開させることができる|

# ディレクトリの意味
|ディレクトリ|意味|
|:--|:--|
|/bin|Linuxシステムの動作に最低限必要な重要度の高いコマンドを格納している|
|/dev|ディスクやキーボードなどのハードウェアをファイルとして扱えるように用意されたデバイスファイルを格納している|
|/etc|設定ファイルを置くためのディレクトリ<br>Linux自体の設定に関わるファイルもこのディレクトリにある|
|/home|ホームディレクトリ<br>この下にユーザごとのディレクトリがある<br>ユーザーはこのホームディレクトリ内に自由にファイルやディレクトリを作成して作業を行うことができる|
|/sbin|実行ファイルを置くためのディレクトリ<br>管理者ユーザ向けのコマンドが置かれてる|
|/tmp|一時的なファイルを置くためのディレクトリ<br>このディレクトリ内のファイルは定期的に削除する設定となっている|
|/usr|各種アプリケーションとそれに付随するファイルを置くためのディレクトリ|
|/var|変化するデータを置くためのディレクトリ|

# 記号の意味
|記号|意味|備考|
|:--|:--|:--|
|$|一般ユーザー||
|#|スーパーユーザー||
|.|カレントディレクトリ||
|/|ファイルパス区切り||
|*|任意の文字列||
|?|任意の1文字||

# ファイル検索について

```ファイル検索を行うfindの基本形.sample
find <①検索開始ディレクトリ> <②検索条件> <③アクション>
```

|①検索開始ディレクトリ|意味|
|:--|:--|
|.|カレントディレクトリ|

|②検索条件|意味|備考|
|:--|:--|:--|
|-name "*.txt"|大文字小文字を区別して.txtで終わるファイルを検索する|
|-iname "*.txt"|大文字小文字を区別せず.txtで終わるファイルを検索する|
|-type f|通常ファイルを検索する|
|-type d|ディレクトリを検索する|
|-type l|シンボリックリンクを検索する|
|-type f -a -name '*.txt'|通常ファイルでファイル名が.txtで終わるファイルを検索する|-aはandという意味<br>ちなみに-aは省略していい|

|③アクション|意味|備考|
|:--|:--|:--|
|-print|パス名を表示する|アクションを省略すると-printになる|

# 高速ファイル検索について
高速にファイル検索を行う場合はlocateを利用する
findと異なり、あらかじめデータベースを作成した後にそのデータベースを利用するため、その場で検索を始めてしまうfindと異なり、かなり高速にファイル検索ができる
デフォルトでは利用できない
locate --versionを実行し、何も見つからなければyumやapt-getでインストールする必要あり

```centosの場合.sample
sudo su
yum -y install mlocate
```

```ubuntuの場合.sample
sudo su
apt-get install mlocate
```


mlocateインストール後、updatedbでファイルパス一覧をデータベースに登録する
一度実行したあとは、locateコマンドによって自動でデータベースが更新されるため、再度実行する必要はなし

```centosとubuntu共通.sample
updatedb
```

locateでファイル検索を行う場合は下記のフォーマットで行う

```ファイル検索を行うlocateの基本形.sample
locate [①オプション]<②検索パターン>
```

|①オプション|説明|備考|
|:--|:--|:--|
|-i|大文字小文字を区別しない|iはignore_caseの略|
|-b|ファイル名だけを検索対象にする|bはbasenameの略|
|-a|AND検索する||

|②検索パターン|説明|
|:--|:--|
|"*.txt"|.txtを含むファイルを検索|
|"bash" "doc"|"bash"または"doc"を含むファイルを検索|

# vimについて
|用語|説明|備考|
|:--|:--|:--|
|デリート|カットのこと||
|ヤンク|コピーのこと|ややこしいけどLinuxでのヤンクとまた意味が異なる|
|プット|ペーストのこと||

|コマンド|説明|備考|
|:--|:--|:--|
|vim --version|vimのバージョンを確認する|インストールされていないとバージョンが表示されない|
|yum install vim|vimをインストール(CentOS)||
|apt-get install vim|vimをインストール(Ubuntu)||
|vim ファイル名|vimでテキストを開く|
|vimtutor|vimのチュートリアルを開始する|vimに慣れていない人は是非試してみるといい|

通常モード

|コマンド|説明|備考|
|:--|:--|:--|
|h|←|慣れるとカーソルキーより速い|
|j|↓|慣れるとカーソルキーより速い|
|k|↑|慣れるとカーソルキーより速い|
|l|→|慣れるとカーソルキーより速い|
|x|1文字削除|dlと動作は同じ|
|i|挿入モードにする|insertの略|
|a|挿入モードにする|iとの違いはカーソル位置の右にカーソルが合うこと|
|0|行頭へ|
|$|行末へ|
|w|記号区切りで右へカーソル移動||
|b|記号区切りで左へカーソル移動||
|W|スペース区切りで右へカーソル移動||
|B|スペース区切りで左へカーソル移動||
|gg|最初の行へジャンプ|
|100G|100行目へジャンプ|
|G|最後の行へジャンプ|
|:q|保存せず終了||
|:q!|保存せず強制終了||
|:w|保存||
|:w ファイル名|別名保存||
|:wq|保存して終了||
|dd|行デリート|
|d$|行末までデリート|
|d0|行頭までデリート|
|dl|1文字デリート|
|dw|単語1つデリート|
|dgg|最初の行までデリート|
|dG|最後の行までデリート|
|yy|行ヤンク|
|y$|行末までヤンク|
|y0|行頭までヤンク|
|yl|1文字ヤンク|
|yw|単語1つヤンク|
|ygg|最初の行までヤンク|
|yG|最後の行までヤンク|
|p|デリート、ヤンクした文字列をプット(貼り付け)|
|J|現在の行とすぐ下の行を連結|xだと改行を消せないので、その時に使う|
|u|アンドゥ|直前の操作を取り消すこと|
|control+r|リドゥ|アンドゥを取り消すこと|
|/検索文字列|下方向に向かって文字列を検索|現在のカーソル位置から検索するのでggを入力してから検索するといい<br>nで次へ、Nで前へ|
|?検索文字列|上方向に向かって文字列を検索|現在のカーソル位置から検索する<br>nで次へ、Nで前へ|
|:%s/置換元文字列/置換後文字列/g|||
|:help|ヘルプコマンド|リンクがあるので、リンクの上でcontrol+]を押すと飛べる<br>リンク先から戻るにはcontrol+t|
|:help コマンド|コマンドのヘルプを表示する||

挿入モード

|コマンド|説明|備考|
|:--|:--|:--|
|esc|通常モードへ|

#setコマンドのオプション
|オプション|ON時の動作|備考|
|:--|:--|:--|
|ignoreeof|control+Dを押してもシェルを終了しない||
|noclobber|既に存在するファイルをリダイレクトで上書きしない||
|noglob|パス名展開を無効にする|*はそのまま*になる|

#shoptコマンドのオプション
|オプション|ON時の動作|備考|
|:--|:--|:--|
|autocd|ディレクトリ名のコマンドを実行すると、それがcdコマンドの引数に指定したものとして実行される||
|dotglob|*や?を使ったパス名店会の結果に、.で始まるファイルも含める||
|cdspell|cdコマンド実行時、ちょっとしたミスタイプを自動修正して実行||
|globstar|パス名展開で**というパターンを使うと、サブディレクトリまで含めたすべてのファイルにマッチする||
|histappend|bashを終了するとき、履歴ファイルにコマンド履歴を追記し、上書きしない||
|sourcepath|sourceコマンドでのサーチパス検索をしない|

# bashの設定ファイル

|設定ファイル|説明|備考|
|:--|:--|:--|
|/etc/profile|シェル起動時に一番最初に呼ばれるシェルスクリプト|ディストリビューションごとに適切な設定があらかじめ書かれているので修正する必要はない|
|~/.bash_profile|/etc/profileのあとに呼ばれるシェルスクリプト|ログインしたときだけ読み込まれる|
|~/.bashrc|基本的に~/.bash_profileから呼ばれるシェルスクリプト<br>bashを起動するたびに読み込まれるシェルスクリプトでもある|基本的にこのファイルだけ修正すればいい|

# killコマンドで利用可能なシグナル一覧
|シグナル|番号|説明|備考|
|:--|:--|:--|:--|
|SIGKILL|9|プロセスを強制終了します|プロセスが終了しないときの最終手段|
|SIGTERM|15|プロセスを終了します|killコマンドのデフォルトのシグナル|
|SIGTSTP|20|プロセスを一時停止します|control+zと同じ|
|SIGINT|2|プロセスを終了します|control+cと同じ|

# その他
|その他|解説|
|:--|:--|
|ls -Fで表示されるファイル種別|記号なし 通常ファイル<br>/ ディレクトリ<br>* 実行可能<br>@ シンボリックリンク|
|Linuxでコマンドが成功したときの挙動|なにも表示されなければ成功|
|-r|だいたい再帰オプション(ディレクトリの下のファイルやフォルダまで対象にするという意味)|
|Linuxにおけるリンクの意味|別名|
|Linuxの日本語マニュアル|http://linuxjm.sourceforge.jp/|
|エイリアスなしでコマンドを実行するには|フルパスでコマンドを実行する|
|source ~/.bashrc|bashの再起動をせずに.bashrcの設定を即時反映したい時とかに実行する||
|/dev/null|スペシャルファイルと呼ばれる特別なファイル。入力先として指定しても何も内容を返さない。出力先として指定しても、書き込んだデータはどこにも保存されずに消えてなくなる|