Linuxの基本とよく使うコマンド

<h1>Linuxとは</h1>
	OSの一種。コンピュータを動かすための基本ソフト
	例）　windows,android,MacOSX,Linux
	
<h1>Linux誕生の歴史</h1>
	1970年代　UnixというOSが誕生
			有料でライセンス縛りが厳しかった
	1985年〜　オープンソース版のUnixを開発するプロジェクトが開始
			ソースコードも公開されて様々な派生版Unixが誕生
	1991年〜　リーナス・トーバルズがLinuxを開発、オープンソース化
			UNIXを真似て、１からOSを作る
	現在まで　Linuxという形でライセンスの縛りもなく無償で誰でも使えるようになった
	
<h1>どこで使われているか</h1>
	サーバー
	組み込み
	デスクトップ
	
<h1>特徴</h1>
	オープンソースなので誰でも自由に使える
	世界中で使われていて信頼性が高い
	品質の高い多くのソフトウエアが利用できる
	自動化するための仕組みがあり、サーバー運用が行いやすい
	
<h1>欠点</h1>
	商用アプリケーションがあまり存在しない
		Microsoft Officeが動作しない
		画像、音楽、動画などのマルチメディア系ファイルを編集するのが苦手
	日本語対応されていない部分が多い
	
	
<h1>なぜLinuxを学ぶのか</h1>
	幅広い場所で使われている
		サーバー用、組み込み用の９０％が使われている
		
	長年使える
		良くも悪くも技術が枯れている（Linuxの技術は長い時間かけて多くのユーザーに検証された結果、大きく変更する必要がなくなった）
		
		
<h1>Linux ディストリビューションとは</h1>
	カーネルとは
		OSの中核となるソフトウエア（狭義のLinux）
		
	ディストリビューションとは
		カーネルに色々なソフトウエアを組み合わせて使いやすくしたもの。
		
	ディストリビューションの種類
		
		例）
			Red Hat系
				Red Hat Enterprise Linux
				CentOS
				Fedora
			Debian系
				Debian GUN/Linux
				Ubuntu
			
	
<h1>シェルとは</h1>
	シェルは、LinuxのCLIを提供するソフトウエア。ユーザーとLinuxカーネルの仲介役をしている。
	一言で言うと「コマンドを入力する場所」
	
		CLI　＝　全てのやりとりを文字によって行う方式（インターフェース）
	
	ユーザー　→（コマンド入力）→　シェル　→（コマンド伝える）→　Linuxカーネル
	ユーザー　←（コマンド結果）←　シェル　←（コマンド実行）←　Linuxカーネル
	
<h1>シェルの画面</h1>
	[ユーザー名@ホスト名~]＄
		
		ユーザー名　＝　使用しているコンピュータにログインしているユーザー
		ホスト名　＝　コンピュータの識別名
		＄　＝　プロンプト（コマンドを入力する部分）
		
<h1>シェルの仕組み</h1>
	１　ユーザーがプロンプトにコマンドをうつ
	２　シェルが入力された名前のコマンドを探す
	３　Linuxカーネルが見つかったコマンドを実行する
	４　シェルが実行結果を画面に表示する
	
<h1>Linuxを操作する（ターミナル）</h1>
	ターミナルとは
		入出力の画面を提供するソフトウエア。
		シェルはコマンドを解釈するソフトウエア。

	シェルの種類
		sh
			もっとも古いシェル
			ほぼ全てのUnixで利用できる標準的なシェル機能は少ない

		bash
			shを基本として機能を拡張したシェル
			Linux環境でデフォルトのログインシェル
			学習で使うならbashがおすすめ

		zhs
			bashの機能を取り込み、独自の拡張も追加
			機能の豊富なシェル
		
<h1>Linuxの設計思想（有用な考え方）</h1>
	1つのプログラムには1つのことをうまくやらせる
	色々な機能をできるだけ細かく切り分けて作る
	
	
<h1>シェルの便利機能（ショートカットキー）</h1>

	カーソルの移動
		Ctrl(cmd) + f　一文字次へ移動
		Ctrl(cmd) + b　一文字前へ移動
		Ctrl(cmd) + a　行の先頭に移動
		Ctrl(cmd) + e　行の最後に移動
		Meta(esc) → f　一単語次へ移動
		Meta(esc) → b　一単語前へ移動
		※ escキーは同時押ししない
	
	文字列の編集
		Ctrl + h　カーソルの左側を一文字削除
		Ctrl + d　カーソル部分を一文字削除
		Ctrl + w　カーソル位置の単語を削除
		Ctrl + u　カーソル位置から行頭まで削除
		Ctrl + k　カーソル一から行末まで削除
		Ctrl + y　最後に削除した内容を挿入
		
	トラブル時の対応
		Ctrl + c　実行中のコマンドを強制終了
		Ctrl + l　画面の消去
		Ctrl + s　画面表示のロック（キーボードから文字の入力を受け付けない）
		Ctrl + q　画面表示のロック解除
		
	補完・コマンド履歴
		Tab　コマンドやパスの補完
		Ctrl + p(↑)　　　一つ前の履歴を見る
		Ctrl + n(↓)　　　一つ後の履歴を見る
		Ctrl + r　　　　　コマンド履歴をインクリメンタル検索
			文字の入力　　コマンド履歴から検索
			Ctrl + r　　　　1つ前の検索結果へ移動
			Enterキー　　　現在の検索結果を実行
			Escキー　　　　現在の検索結果を表示したままコマンドラインに戻る
			Ctrl + g　　　　検索結果を破棄し、コマンドラインに戻る
			

<h1>ディレクトリを操作する</h1>
	ディレクトリとは
		階層構造を持ったファイルのこと。
		
	ディレクトリの構造
			例１）Linuxの場合
				/　＃ルートディレクトリ
				┣bin
				┣dev
				┣etc
				┣home　
				┣sbin
				┣tmp
				┣usr
				┗var
					
			例２）windowsの場合
				Cドライブ
					┗Downloads
				Dドライブ
					┗#########
				
				windowsはドライブから入れ子構造が始まる
				Linuxは1つのディレクトリ(/)から入れ子構造が始まる
			

<h1>マウントとは</h1>
ルートディレクトリ配下にディレクトリとしてくっつける操作のこと。
			
<h1>主要なディレクトリの役割</h1>
	/bin
		・一般ユーザー及び管理ユーザーが使用するコマンドの実行ファイルを格納
		・特にLinuxの動作に最低限必要な重要度の高いコマンドの実行ファイルを格納

	/dev
		・デバイスファイルを格納
			デバイスファイル：ハードウエアをファイルとして扱えるようにしたファイル

	/etc
		・設定ファイルを格納
		・Linuxで動作するアプリケーションファイルの設定ファイルが置かれている
		・Linux自体の設定に関わるファイルが置かれている

	/home
		・ホームディレクトリ（各ユーザーの個人用ディレクトリ）が配置されている
		・ユーザーはホームディレクトリ内に自由にファイルやディレクトリを作成できる

	/sbin
		・管理者ユーザー向けのコマンド実行ファイルを格納

	/tmp
		・一時的なファイルを格納
		・アプリケーションの実行中に結果を一時的にファイルとして保存する場合に使用

	/usr
		・各種アプリケーションと、それに付随するファイルを格納

	/var
		・変化するデータを格納
		・アプリケーションを動作する上で作成されたログなどを格納
			
			
<h1>cdコマンド（ディレクトリの移動）</h1>
		略元：　change directory
		書式：　$ cd [オプション] [ディレクトリ]
		
		   ※ []は任意という意味
			
</h1>特殊なディレクトリの指定</h1>

|ディレクトリ  |意味  |指定方法  |
|---|---|---|
|カレントディレクトリ  |現在自分のいるディレクトリ  |.  |
|親ディレクトリ  |1つ上の階層ディレクトリ  |..  |
|ホームディレクトリ  |「/home/ユーザー名」ディレクトリ |~  |
|ルートディレクトリ　|「/」ディレクトリ　|/  | 
				
<h1>pwdコマンド（カレントディレクトリの表示）</h1>
		略元：　print name of working directory
		書式：　$ pwd [オプション]
		
		現在自分のいるディレクトリを表示される
		homeディレクトリとは、/homeではなく、/home/ユーザー名のこと。
		
		
<h1>lsコマンド（ディレクトリの中身を一覧表示）</h1>
		略元：　list
		書式：　$ ls [オプション] [ディレクトリ・ファイル名]
		
		例）
			$ ls /
			$ ls / /dv　#複数のディレクトリを指定する時
			
		パス名展開
			パス名展開を使うと複数のファイルを一度に指定できる	
			例）
				$ ls *.html　　　#拡張子がhtmlのファイルの一覧を表示
				$ ls /bin/z???　　#zから始まり4文字で終わるファイルを表示
		
		よく使うオプション
		
			$ ls -l　＃ファイルの詳細情報を表示
				例）
					drwxr-xr-x 2 hoge hoge 6 8月 6 11:57 dev
				
			$ ls -a　＃隠しファイルを含めた全てのファイルを表示
				「.」で始まるのが隠しファイル
				
			$ ls -F　＃ファイルの種別を表示
				/	ディレクトリ
				＠	シンボリックリンク
				*	実行可能ファイル
				記号なし	通常ファイル

ファイルの詳細の見方

|||
|---|---|
|ファイルタイプ　|d　|
|ファイルモード　|rwxr-xr-x　|
|リンク数　|2　|
|所有者（左）　|hoge　|
|所有グループ（右）　|hoge　|
|サイズ　|6　|
|タイムスタンプ　|８月 6 11:57　|
|ファイル名・ディレクトリ名　|dev　|


<h1>mkdirコマンド（ディレクトリの作成）</h1>
		略元：　make directory
		書式：　$ mkdir [オプション] <作成するディレクトリ名>

			※<>は必須という意味
			
		オプション
			$ mkdir -p test/2019/08
				-pオプションは、階層ディレクトリを丸ごと指定して作成するオプション
		

<h1>rmdir（ディレクトリの削除）</h1>
		略元：　remove directory
		書式：　$ rmdir <ディレクトリ名>
			空ではないディレクトリを削除しようとするとエラーが起こる。
			中身のあるファイルを間違って削除してしまう事故を防げる。
		

<h1>パスとは</h1>
		ディレクトリやファイルの住所情報
		階層の区切りを「/」で表現する。
		
		例）
			/home/kume
			
			Linuxの場合は「/」
			windowsの場合は「¥」
		
		絶対パス
			「/」から始まるパス
			
		相対パス
			カレントディレクトリから始まるパス
			
			
		特別なディレクトリの表記
		
			例えば、下記のような構造にいるとする。★が自分のいる場所（カレントディレクトリ）
				例）
					/
					└home
						└★kume
							└code
								└README.md
		
			相対パス	絶対パス
			../..	/
			..	/home
			.	/home/kume
			code(./code)	/home/kume/code
			code/work(./code/work)	/home/kume/code/README.md
			
			
<h1>コマンドの使い方を調べる</h1>
		書式：　$ <コマンド> --help
		
			コマンドの使用方法、概要、利用可能なオプション一覧が表示される。
			
		書式： $ man <調べたいコマンド>
			　$ man -k move　＃キーワードから検索もできる
		
			--helpオプションよりも詳しい。コマンドをきちんと理解したい時に使う。
				
				j で上へスクロール
				k で下へスクロール
				q で終了
				
				
<h1>ファイルを操作</h1>

<h1>catコマンド（ファイルの中身を表示）</h1>
		略元：concatenate
		書式：$ cat [オプション] <ファイル名>
		
			※複数ファイルをまとめて表示もできる
		
		オプション
			-n　＃ファイルの詳細情報を表示（行番号がつく）
		
		
<h1>lessコマンド（ファイルの中身をスクロール）</h1>
		略元：less - opposite of more
		書式：$ less [オプション] <ファイル名>
		
			※長いファイルの中身を見たい時に使う
			
操作方法

|コマンド　|内容　|
|---|---|
|スペース,f　|一画面下へスクロール|
|b　|一画面上へスクロール|
|j　|１行下へスクロール|
|k　|１行上へスクロール|
|q　|lessコマンドの終了|

		
検索の操作

|コマンド|内容|
|---|---|
|/<文字列>|下方向に検索|
|?<文字列>|上方向に検索|
|n|次の検索結果に移動|
|N|前の検索結果に移動|
			
	
<h1>ファイルの種類</h1>
		テキストファイルとは
			文字列を扱ったファイルのこと。
			OSに関わるほとんどの設定情報をテキストファイルとして管理している。
			
		バイナリファイルとは
			画像ファイル、音声ファイル、実行ファイルなどのこと。
			文字コード以外の数値を含むようなファイルもバイナリファイルと呼ぶ。
		
		
<h1>touchコマンド（ファイルを作成）</h1>
		略元：touch
		書式：$ touch <新規ファイル名１> <新規ファイル名２>…
		
			※ファイル名が存在しない時はからのファイルを作成する
			　本来は存在しているファイルのタイムスタンプを更新するコマンド
			　間違って操作しても上書きしない安全なコマンド
		
<h1>rmコマンド（ファイルを削除）</h1>
		略元：remove
		書式：$ rm [オプション] <削除するファイル名１> <削除するファイル名２>…
		
			※完全に削除するために復活できないため注意！
			
		オプション
			-r　＃ディレクトリ構造、中身も合わせて削除する（危険）
			-f　＃ファイルを削除する際に警告文を表示しない（危険）
			-i　＃ファイルの削除前に確認する
	

<h1>mvコマンド（ファイルの移動、ファイル名の変更）</h1>
		略元：move
		書式：$ mv [オプション] <移動元> <移動先>
		
			※指定する先によって挙動が異なる
				移動先がファイルの場合　＝＞　ファイル名が変わる
				移動先がディレクトリの場合　＝＞　ファイルが移動する
			
		オプション
			-i　＃上書きする前に確認する
		
<h1>cpコマンド（ファイル・ディレクトリをコピー）</h1>
		略元：copy
		書式：$ cp [オプション] <コピー元> <コピー先>
		
			※コピー先のファイルがすでにある場合は上書きしてしまう注意
			
		オプション
			-i　＃上書きする前に確認する
			-r　＃ディレクトリをコピー
		
<h1>lnコマンド（リンクを貼る）</h1>
		略元：link
		書式：$ ln [オプション] <リンク元ファイル名> <リンク名>
		
			※オプションを付けないとハードリンクになる。
					
		オプション
			-s　＃シンボリックリンクを指定する
			
<h1>リンクを貼るとは</h1>
			Linuxではファイルに別名をつけることができる。
			別名をつける　＝　「リンクを貼る」
			windowsでいうショートカットのようなもの
			
			ハードリンク（ファイルに複数の名前をつける）
				1つのファイルの実態に複数の名前をつける機能
				元のファイルを削除しても消えない
				全てのハードリンクが無くなった時に削除される
				
			シンボリックリンク（リンク先のパス名を記載しただけ）
				リンク先のパス名が書かれた特殊ファイル（リンク先がファイルの実体）。
				シンボリックリンクを残したままファイルの実体を削除したり、ファイルを移動するとファイルを参照できなくなる。


<h1>どういう時に使うのか</h1>

			長いパス名を省略したい時（階層が深いとアクセスが手間になるため）
			複数バージョンを共存させ最新を区別したい時
			
		
<h1>findコマンド（ファイルを検索）</h1>
		略元：find
		書式：$ find <検索開始ディレクトリ> <検索条件> <アクション>
		
		よく使われる検索条件
			-name ファイル名　＃大文字小文字を区別する（ワイルドカード利用可能）
			-iname ファイル名　＃大文字小文字を区別しない
			-type f　＃通常ファイルを指定
			-type l　＃シンボリックリンクを指定
			-type d　＃ディレクトリを指定
			-a　＃複数の検索条件を指定（省略可能）
			
				ワイルドカードが使える
					'*.html'　＃任意の文字列
					'????.html'　＃任意の文字数（? = 1文字）
		
		よく使われるアクション
			-print　＃パス名の表示
			
			
			
<h1>標準入出力とパーミッション</h1>
	標準入出力とは
		一言で言うと、キーボードから画面に表示されるまでの仕組みのこと。
		プログラムが特になにも指定されていない場合に利用するデータの標準的な入出力元
		
		図）
					ファイル　→┐
			キーボード（標準入力）　→　コマンド実行　→　ディスプレイ（標準出力）
										└→　ファイル（標準エラー出力）
											
			Linuxでは、コマンドの入出力先を抽象化することで、入出力先を柔軟に変更できる。
			
		
<h1>リダイレクトとは（入出力先を変更する機能）</h1>
				
				入力リダイレクト(<)
					キーボードの代わりにファイルから入力する機能
					
					何度も同じコマンドを実行する時などにファイルにまとめておいて、実行しておけばミスも手間もなくせる
					
					例）
						$ cat < /etc/hosts
					
				出力のリダイレクト(>)
					コマンドの実行結果をファイルに保存する機能（画面に表示しない）
					
					例）
						$ ls > output.txt
						
						※正式には1>で表記する（ただし１は省略できる）
					
				標準入出力の数値
					標準入出力などをOSが識別するために用いる識別子
					
					入出力	数値
					標準入力	０
					標準出力	１
					標準エラー出力	２
					
				エラー入力のリダイレクト(2>)
					エラー結果をファイルに保存する機能（画面に表示しない）
					
					例）
						$ ls /hoge 2> error.txt
					
				出力とエラー出力をまとめる(2>&1)
					出力をリダイレクトした後にまとめる。
					
					例）
						$ ls / /hoge > output.txt 2>&1
					
					リダイレクトで追記
						「>」でファイルを上書き
						「>>」でファイルを追記
					例）
						$ echo Hello! >> output.txt
				
		
<h1>/dev/nullとは</h1>
　入力先として指定しても何も返さず、出力先として指定してもデータは消え何も表示されない特別なファイル
			
			入力先として指定
				入力が何もない状態になる
				コマンドのテストなどで入力を空にしたい時に使用する
				
			出力先として指定
				結果が何も表示されない
				結果が大量にあり、結果を非表示にしたい時に使用する
				
				
<h1>パイプラインとは</h1>
複数のコマンドを連携させる機能。
			コマンドの標準出力を別のコマンドの標準入力に繋げる
			
			書式：$ コマンド | コマンド
			
			例）
				$ ls /bin | grep systemd | less
				
					ls…
					grep…
					less…
			
<h1>まとめ</h1>
　Linuxの設計思想は、小さなことを1つずつ動かし、組み合わせる事で複雑な操作を可能にする。それを実現するために標準入出力の仕組みがある。
			
			
<h1>パーミッションとは</h1>
ファイルの権限管理のこと。
		Linuxは複数人がアクセスして使うように作られているために権限がある。
		
		
<h1>ファイルのオーナーとグループ</h1>
			ファイルには全てオーナー（所有者）とグループ（所有グループ）が設定されている。
			
			詳細
				前提：Linuxはユーザーごとにアカウントを発行している。
				オーナー：ファイルの所有者
				グループ：ファイルの所有グループ。ユーザーをグループに所属させ、グループに権限を与えることで複数ユーザーを一括で管理できる。
			
			確認方法
				$ ls -l ファイル名　＃ファイルのオーナーとグループが確認できる。
				
				例）
					-rwxr-xr-x. 1 root root 158240 7月 31 2015 /bin/less
					
						root（左）　＝　オーナー
						root（右）　＝　グループ
						
<h1>ファイルのパーミッション</h1>
			ファイルやディレクトリを「誰がどのように操作できるか」を定めたのがパーミッション。
			
			パーミッションの確認方法
			$ ls -l ファイル名
			
			例）
				-rwxr-xr-x. 1 root root 158240 7月 31 2015 /bin/less

パーミッションの見方

|||||
|-|-|-|-|
|ファイルタイプ|オーナーの権限|グループの権限|その他ユーザーの権限
|-|rwx|r-x|r-x|

				
記号の意味

|記号|内容|
|-|-|
|r|read（読み取り）|
|w|write（書き込み）|
|x|execute（実行）|
|-|権限なし|
		
<h1>chmodコマンド（ファイルモード）</h1>
ファイルやディレクトリのパーミッションを設定する。

			略元：change mode
			書式：chmod [ugoa] [+-=] [rwx] <ファイル名>

			例）
				$ chmod u+r file
				
					ファイルに対して所有者の権限を追加する

記号|内容
-|-
u|所有者の権限
g|グループの権限
o|その他のユーザーの権限
a|全ユーザーの権限
+|権限を追加
-|権限を削除
=|記述した権限にする
			
			
<h1>数値で指定する方法(chmodコマンド)</h1>
			書式：chmod <8進数の数値> <ファイル名>

				例）
					$ chmod 755 file
				
					通常指定　＝　相対指定
					数値指定　＝　絶対指定

パーミッション|数値
|-|-|
r（読み取り）|4
w（書き込み）|2
x（実行）|1
			
数値で置き換えて足し合わせる。

オーナー|グループ|その他
|-|-|-|
rwx|r-x|r-x
421|4 1|4 1
7|5|5
			
		
<h1>スーパーユーザー</h1>
管理者権限を持つ特別なユーザー（root）
			
			背景
				システムの根幹に関わる作業が誰にでもできると危険
				システムの根幹に関わる作業はスーパーユーザーだけができるようにしている。
				
			コマンド
			$ sudo <コマンド>
			
			略元：switch user and do
			
	
<h1>プロセスとは</h1>
実行中のプログラムのこと。

コマンドを実行すると、実行ファイルをメモリに格納してメモリ上でCPUがプログラムを実行する。1つ実行する度に新しいプロセスが1つ作られる。
		
		
		psコマンド（実行中のプロセスを表示する）
			略元：process status
			書式：ps [オプション]
			
			例）
				$ ps
				
				１行ずつが1つのプロセスとして表示される。
				PID ＝　プロセスID
				CMD ＝　実行中のコマンド
				
			オプション
				$ ps aux
				
					-は付けない。
					x	実行したユーザーの全てのプロセスを表示
					a	全てのユーザーのプロセスを表示する
					u	詳細情報を合わせて表示する
					他にもたくさんある。
					
					
<h1>ジョブとは</h1>
まとめて実行されるプロセスの集まりのこと。シェルごとに管理されるもの。

		例）
			$ ps aux | grep bash | less
			
				psaux,grep bash, lessで3つのプロセスが生成
				3つのプロセスが連なって1つのジョブを生成する。
				
				ジョブとプロセスの違い
					プロセスは、OS全体で統一して管理されている。
					ジョブは、そのジョブを実行するシェルで管理されている。
				
				ジョブにもIDが存在する。
		
<h1>fg・bgコマンド（ジョブの状態を変更する）</h1>
			バックグランドとフォアグラウンド
				バックグラウンド　＝　シェルの画面外でコマンドを実行すること
				フォアグラウンド　＝　シェルの画面内でコマンドを実行すること
				
<h1>jobsコマンド</h1>
				略元：jobs
				書式：$ jobs
				
				例）
					$ jobs
					[1]+　実行中　sleep 10 &　
					
					＃ジョブID、実行状況、実行コマンドを表示
					
					
<h1>fgコマンド（ジョブをフォアグラウンドにするコマンド）</h1>
				略元：foreground
				書式：$ fg %<ジョブID>
				
				例）
					$ fg %1
				
				ジョブをフォアグラウンドに戻して対話的に操作したい時に使う
				
<h1>bgコマンド（ジョブをバックグラウンドにするコマンド）</h1>
				略元：background
				書式：bg %<ジョブID>
				
				例）
					$ bg %1
					
					長い時間かかる処理をバックグラウンドで実行することで、コマンドが終了するのを待たなくても良くなる。
			
				
<h1>killコマンド（プロセス・ジョブを終了する）</h1>
			不要なジョブやプロセスを終了させる。
			略元：kill process
			書式：kill [オプション] %<ジョブID(プロセスID)>
			
			例）
				$ kill %1
				$ kill 4965
				
				フォアグラウンドのジョブはCtrl+cで終了できる。
				停止中やバックグラウンドのジョブはkillコマンドで終了できる。
				
			補足
				$ kill -<シグナル名> <プロセスID>
				
					正確には、killコマンドはシグナルを送信するコマンド。
					デフォルトでは、TERM（終了）というシグナルを送信している。
				
			強制終了のシグナル（時々使うができるだけ使わない方がいい）
				$ kill -SIGKILL 4965
				$ kill -9 4965
				
					この二つのコマンドは同じ

参考元
[もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう/山浦清透](https://www.udemy.com/course/unscared_linux/)