Linuxについて初学者がまとめてみた！

<h1>Linuxとはなんぞや？</h1>

このページではLinux初学者が自分なりに調べてまとめてみた内容になります。
同じ初学者にとって勉強の一助になれば幸いです。

LinuxはOS(オペレーティングシステム)の一種でコンピューターを動かす為の基本的なソフトです。
他のOSで有名なのはWindows, Mac OS X, Androidなどがあります。
OSがあることでアプリケーションソフト(WordやExcel)を呼び出したりといった様々なことが可能となります。

## Linuxの特徴としては
- オープンソースなのでWindows等と違って誰でも自由に使うことができます。
- 日本を含めた世界中で使われているので信頼できるOSです。
- クオリティの高い様々なソフトウェアを使うことができます。
- 一部の商用目的で作られたタイプを除けば無料で使用することができます。
- CUI(Character Usr Interface)での作業になり、キーボードからコマンドを入力してOSを操作します。
- オープンソースなので進化の過程で様々な人が手を加えたので、色々な種類のLinuxが存在します。

## Linuxのデメリット
- 使用できる商用のアプリケーションなどが存在せず、有名なMicrosoft Officeなども使用できません。
- 日本語対応されていない部分も多く、その場合は英語で内容を理解する必要があります。
- オープンソースなので、Windows PCのようにメーカーのサポートは無く、自力でトラブル解決が必要になります。
- 周辺機器(USBメモリ等)が対応していない場合があり、使えるようにするには手間が掛かります。

## なせLinuxを学ぶのか？
- Web上に存在する大半のサーバーでOSとしてLinuxは使われており、サーバー操作には必須となります。
- Linuxの技術は様々なユーザーに使用・検証されて大きな変更をする必要がなくなっています。
  この技術を学んでおけばこの先もずっと使えるので役に立つこと間違えなしです。
- メリットの内容と重複しますが、基本的に無償のソフトなのでサーバー構築時に安価で対応できます。
  一方でMicrosoftのソフトでも構築できますが、有償なのでコストが掛かります。

## Linuxディストリビューションとは何か？
Linuxの核となるカーネルを各種のアプリケーションソフトなどの周辺機能を一つのパッケージとして配布されているOSの総称を呼びます。
一般的に新しく導入する場合はディストリビューションを入手して各種コンピューターにインストールしてから使用するようになります。
ディストリビューションは1,000種類以上存在しており、それぞれが独自のコミュニティで開発されています。
Red Hat系Debian系が現在の主流です。

## シェルとは？
シェルはLinuxのCLI(Command Line Interface)を提供するソフトでユーザーとLinuxの中心部であるカーネルとの橋渡しをしています。CLIはキーボードからコマンドを入力して、文字列として結果を出力してもらうインターフェースを指します。CLIと良く対比されるのがGUI(Graphycal User Interface)でマウスのポインタを使用して指示したり画面に触れて直接指示するといった方式を取っており、WindowsやMAC OS Xなどで導入されている一般的にメジャーな方式です。

下の画像はLinuxで使われているシェルの画面です。
ユーザー名、ホスト名が表示されており、`＄`がプロンプトとして表示されています。
`＄`が表示されている場合、入力待ち状態でコマンドを実行できる状態にあることを示しています。
![シェルの画面(追記後).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/782abc59-9f4f-b42f-432b-27ab979807c2.jpeg)

シェルにコマンドを入力するとどのように実行されるか、と言いますと
１，ユーザーがターミナル画面にコマンドを入力
２，シェルが入力された名前のコマンドをコマンドのリストから探す
３，シェルが見つけたコマンドをLinuxカーネルに伝える
４，Linuxカーネルはシェルから届いたコマンドの実行ファイルをメモリ上で実行する
５，Linuxカーネルは実行結果をシェルに渡す
６，シェルは受け取った実行結果をターミナル画面に出力する
となります。
ややこしいのですが、ターミナルとシェルは別物になります。
ターミナル：画面を担当するソフト
シェル：コマンドを解釈するソフト

## ディレクトリとは
ディレクトリとはファイルが保存されている場所のことでWindowsやMacでいうところのフォルダと同じ考え方です。
![Linux ディレクトリ説明画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/eac4db0c-1113-2016-3ee7-07df13e20fb3.jpeg)
Linuxではルートディレクトリを頂点とした階層構造になっており、これを**ディレクトリーツリー**と呼びます。
Windowsの場合はディスク毎にドライブが作成されますが、Linuxの場合はディレクトリーツリー方式なので全てが/(ルートディレクトリ)配下に追加されます。
また、現在居るディレクトリをカレントディレクトリと呼びます。

## Pathについて
Path(パス)とは目的のファイルまでの階層を示したルートです。
![ディレクトリ 階層サンプル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/cce75362-c13d-d650-35b9-22b6d878dd0b.jpeg)

パスを表す方法は２種類あり、絶対パスと相対パスです。
絶対パスは/(ルートディレクトリ)から始まるパスです。
一方で、相対パスはカレントディレクトリから始まるパスです。
上記の階層構造について、最下層の`file`までのルートを表すと下記の通りです。
絶対パス：`/home/tohru/file`
相対パス：`./file`

![ディレクトリ 相対、絶対の対比.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/0b802d8f-3cbf-2393-ea64-beccf3838a3a.jpeg)

<h1>Linuxの基本コマンドについて</h1>
以下はLinuxで使われる基本的なコマンドを解説したものです。

## cd
cd は change directryの逆でディレクトリ(フォルダ)を変える為のコマンド
以下に`cd`コマンドと一緒に使うオプションを紹介します。
|  入力方法   |     機能    |
|:-----------:|:------------:|
| cd ..      | 一つ上のディレクトリへ移動        |
| cd ~       | ホームディレクトリへ移動      |
| cd /       | ルートディレクトリへ移動        |

※1, ホームディレクトリは「/home/ユーザー名」
※2, ルートディレクトリはディレクトリ群の一番上に位置するディレクトリ


## pwd
pwd は print name working directryの略で今居るディレクトリの場所を教えてくれるコマンドです。
Linuxにはコマンドが沢山ありますが、基本的には今居るディレクトリ内のファイルに対してコマンドを実行します。
ですので、折角用意したファイルも違う場所に居てコマンドを実行してもエラーが出たり、期待していたアウトプットが得られないケースがあります。
慣れるまではコマンドを実行する前に`pwd`コマンドを実行して現在地を確認することをお薦めします。

## ls
ls は listの略で実行するとカレントディレクトリのディレクトリとファイルを表示してくれるコマンドです。
`ls`コマンドはオプションを追加して実行することもできます。
|   入力方法  |     機能    |
|:-----------:|:------------:|
| ls 場所     | ディレクトリ内にあるファイル、ディレクトリを表示|
| ls *.txt  | 拡張子がtxtのファイルを指定して表示  |
| ls /bin/h?? | hで始まって3文字のファイルだけを表示する |
| ls -a       | ファイルの詳細情報を表示する |
| ls -l       | 隠しファイルも含めた全てのファイルを表示する|
| ls -al      | 上記二つを組み合わせて使うことも可能|
| ls -al /    | オプションと場所の指定を同時に可能|
| ls -F       | ファイル種別を表示する|

※1, 場所の指定は半角スペースを挟んで複数可能
※2, 拡張子は変更可能
※3, 隠しファイルを表示した時は頭に`.`が付きます


## mkdir
mkdir は make directry の略でディレクトリを作成する為のコマンドです。
`mkdir オプション ディレクトリ名`と入力します。
オプションは省略できますが、ディレクトリ名は必須です。
オプションを使った例
`mkdir -p sample/2023/07`
`-p`が無い場合、`sample`と`2023`のディレクトリが事前に作成されていることが必要で、無い状態で実行するとエラーが発生します。
`-p`オプションを実行すると深い階層のところまで一度にディレクトリを作成することができます。

## rmdir
rmdir は remove directry の略です。
`rmdir ディレクトリ名`で実行します。
このコマンドは削除対象のディレクトリが空であることが前提となります。
中に何か入った状態で削除しようとするとエラーが出ますので、注意喚起になって誤って削除することがありません。

##  --helpオプション
使い方をあまり覚えていないコマンドに対して使用します。
`コマンド名 --help`を実行すると`コマンド名`にしていしたコマンドの使い方を詳しく説明してくれます。

##  man
man は manualの略です。
例えば、`man mkdir`と実行すると`mkdir`コマンドの使い方を`--help`オプションよりも詳しく教えてくれます。
表示された内容は最上部にきているので、下の情報を見る為には`↓`を押すか、vim操作の`j`を押せば下にいくことが出来ます。
逆に上へ戻りたい時は`↑` or `k`を押してください。
また、`man`コマンドはこんなコマンドあるのかな？みたいな検索の方法もあります。
具体的には`man -k move`※moveは例です。
move に関連する、moveを含むコマンドが無いか検索します。

## cat
cat は concatenate の略です。
concatenate は連結するという意味です(初めて知った！)。
`cat ファイル名`と入力してファイル名の中身を表示してくれます。
もし`cat`だけ入力してファイル名を入力しなかったら、改行されて
入力待ち状態になってしまいます。
その場合は`Ctrl + d`で元のプロンプト状態に戻ります。

また、以下のような使い方もあります。
`cat -n ファイル名`
この場合、`-n`はオプションでファイルの内容を表示する時に左端側に行数を表示してくれます。

`cat ファイル名 ファイル名`
ファイル名を複数指定することもできて、内容が連続して表示されます。

![cat サンプルコード(加筆後).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/bddb4585-6d98-1123-3e61-e0e1db48becb.jpeg)

※multi on が /ets/host.conf の内容でそれ以下は /etc/hosts.denyの内容です。

## less
`less ファイル名`と入力して実行します。
`cat`コマンドもファイル内を閲覧するコマンドですが、`less`コマンドは中身が長い場合に適しています。
`less`コマンドを実行すると別ウィンドウのようなものが表示されます。
以下のコマンドを使って中身を移動して閲覧します。
| コマンド    |     内容    |
|:-----------:|:------------:|
| スペースキー、f| 一画面下にスクロール        |
| b          | 一画面上にスクロール      |
| j          | 一行下にスクロール        |
| k          | 一行上にスクロール          |
| q          | lessコマンドを終了する       |
| /文字      | 下方向に向かって文字を検索     |
| ?文字      | 上方向に向かって文字を検索    |
| n          | 次の検索結果に移動|
| N          | 前の検索結果に移動|

※コマンドの大半が vim で使われているものと一緒なので vimで慣れておくと後々きっと役に立ちます。

## touch
`touch`は新しくファイルを作成するためのコマンドです。
`touch ファイル名`として使います。
ファイル名を複数指定すれば、一度に複数のファイルを作成できます。

## rm
rm は removeの略です。
ファイルやディレクトリを削除する為のコマンドです。
`rm ファイル名`と入力して使います。
ファイル名を複数していすれば、一度に複数のファイルを削除できます。
このコマンドを実行するとWindowsやMacのようにゴミ箱にいくわけではなく、完全に削除されてしまうので削除前は注意が必要です。
また、`rm`コマンドを使う際に使用できるオプションは下記の通りです。

|   入力方法  |     機能    |
|:-----------:|:------------:|
| rm -r ディレクトリ名 | ディレクトリを削除できる |
| rm -f ファイル名 | 削除前の警告文無しでファイルを削除できる |
| rm -i ファイル名 | 削除する前に確認をしてくれる  |
| rm -rf ディレクトリ名| 警告文無しでディレクトリを削除できる |

※1, `rm`コマンドはファイル削除用のコマンドなので、ディレクトリを削除する場合はオプションで指定が必要
※2, `-r`オプションを付けるとディレクトリの中にあるディレクトリやファイルも削除されてしまうので、削除は慎重にやること


## mv
mv は moveの略です。
`mv 旧ファイル名 新ファイル名2` や `mv ファイル名 ディレクトリ名`といった感じの入力をして実行します。
ファイルの移動やファイル名を変更するコマンドです。
ファイル名を変更する場合は`mv 旧ファイル名 新ファイル名`と入力
ファイルを移動する場合は`mv ファイル名 ディレクトリ名`と入力
ディレクトリの移動や名前の変更もファイル同様行うことができます。
但し、ファイル名の変更に関してはちょっと注意が必要です。
例えば、`mv dir1 dir2`と実行した時に既に`dir2`が存在する場合は
`dir1`が`dir2`に移動されてしまい、名前の変更ができません。
この場合は`mv -T dir1 dir2`とすることで名前の変更が可能です。
但し、変更後のディレクトリが空 or 存在しないことが前提です。

## cp
cp は copyの略です。
`cp 元ファイル名 コピーファイル名`と入力してディレクトリ内でコピー
`cp 元ファイル名 ディレクトリ名`と入力して別ディレクトリ内にコピー
別のディレクトリ内にコピーする場合、既に同じ名前のファイルが存在すると上書きされてしまうので注意が必要です。
また、オプションを使った実行方法は下記の通りです。
`cp -1 元ファイル名 コピーファイル名`上書きする前に確認してくれる
`cp -r 元ディレクトリ名 コピーディレクトリ名`ディレクトリのコピー
`cp`コマンドはファイルのコピーをする為のコマンドなので、ディレクトリをコピーする時はオプションで指示が必要です。

## ln
ln は linkの略です。
`ln リンク元ファイル名 リンク名`で実行します。
このコマンドを実行すると１つのファイル名に対してもう１つ新しいファイル名が付与されます。これを**ハードリンク**と呼びます。
**ハードリンク**はオリジナルファイルと中身が同じ内容です。
`ln -s リンク元ファイル名 リンク名`という実行方法もあります。
このコマンドを実行した場合、リンク元ファイル名の内容を参照する**シンボリックリンク**が作成されます。**シンボリックリンク**では元ファイルの内容を参照する為のパス名が記載されているだけで元ファイルの中身は記載されていません。
上記２つに関して元ファイルを削除した場合、**ハードリンク**には特に影響がありませんが、**シンボリックリンク**の場合は参照先のファイルが無くなるのでエラーが発生します。
２つのリンクについて使い分けですが、**ハードリンク**は異なるディスクを跨いで作成できなかったり、ディレクトリに対して使えないといった制限がある一方で**シンボリックリンク**にはその制限が無い為、後者の方が使用頻度が高いです。

![ln サンプルコード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/33904b37-7374-42b2-00d8-ede0c4e5a378.jpeg)

サンプルコードで見て頂くと分かり易いですが、リンクごとにファイル名が色分けされています。
`test`が元ファイルで `test_hard` がハードリンク用のファイル、test_symbolicがシンボリックリンク用のファイルとなります。

## find
find は略称ではなくそのままです。
`find 検索開始ディレクトリ 検索条件 アクション`で実行します。
Linuxでは使うファイルが沢山あるので、全ての場所を覚えておくことは非現実的です。`find`コマンドで探して使えば良いのです。

検索条件の使用例は下記の通りです。
`find . -name README.md -print`
`.`(カレントディレクトリ)を起点に名前が`README.md`に合致するファイルを探してパスを`-print`で出力します(`-print`は省略可)。

`find . -name '*.html' -print`
`.`(カレントディレクトリ)を起点に名前が`'*.html`と一致するファイルを探してパスを`-print`で出力します(`-print`は省略可)。
`*`はワイルドカードで任意の文字列を表します。
`?`を使った場合は任意の１文字になります。
`*`は`''`で囲まないとエラーになりますのでご注意ください。

`find . -iname readme.md -print`
`.`(カレントディレクトリ)を起点に名前が`readme.md`と大文字小文字を区別しなくても一致する`-iname`ファイルを探してパスを`-print`で出力します(`-print`は省略可)。

その他に使われるオプションをご紹介します。
| コマンド    |     内容    |
|:-----------:|:------------:|
| -type f    | 通常のファイルとして指定する |
| -type l    | シンボリックリンクとして指定する |
| -type d    | ディレクトリとして指定する |

複数の条件を指定する場合は下記のように入力します。
`find . -type d -a -name new_file -print`
`.`(カレントディレクトリ)を起点にディレクトリでファイル名が`new_file`という名前のディレクトリを探して出力します。
`-a` は条件の結合をする為に使われていますが省略可です。

## chmod
chomode は change modeの略です。
このコマンドを説明する前にファイルのパーミッションを説明します。
全てのファイルには**Owner(所有者)** と **Group(所有グループ)**　が設定されており、権限の管理がされています。
まず、前提としてLinux内部ではユーザーごとにアカウントが発行されています。
Ownerはファイルの所有者
Groupはファイルの所有グループです。
本来であればユーザー1人1人に対してファイルの権限が付与されるべきですが、複数ユーザーを一元管理できるようにグループに所属させます。

権限の確認には`ls -l`コマンドを使います。
サンプルコード：`ls -l /etc/yum.conf`
実行結果：`-rw-r--r--. 1 root root 970 10月 2 2020 /etc/yum.conf`
左側の`root`がOwner, 右側の`root`がグループを意味しています。
また、`-rw-r--r--.`ファイルのパーミッションを表しています。
`-`がファイルタイプ、
`rw-`が所有者(Owner)のパーミッション
`r--`がグループ(Group)のパーミッション
`r--`がその他のユーザー(Other)のパーミッション

![ls -l サンプルコード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/71ba5390-de50-571a-82a1-a1c4aeed232b.jpeg)

パーミッションの記号が表している内容は下記の通りです。

| 記号       |     内容    |
|:-----------:|:------------:|
| r          | read (読み取り) |
| w          | write (書き込み)|
| x          | execute (実行) |

`-rw-r--r--.`の場合だと

| 対象ユーザー|読み取り|書き込み|実行|
|:-----------:|:------:|:------:|:---:|
| Owner      |   〇  |   〇  |  × |
| Group      |   〇  |   ×   |  × |
| Other      |   〇  |   ×   |  × |

前置きの説明が終わったので、`chmod`コマンドを説明していきます。
入力方法は`chmod 記号1 記号2 記号3 ファイル名`となります。
| 記号1       |     内容    |
|:-----------:|:------------:|
| u (Owner)  | Ownerの権限 |
| g (Group)  | Groupの権限 |
| o (Other)  | Otherの権限 - その他のユーザー |
| a (All)    | Allの権限 - 全ユーザー  |

| 記号2      |     内容    |
|:-----------:|:------------:|
| +          | 権限を追加 |
| -          | 権限を削除|
| =          | 記述した権限にする |

※`=`を使うと`+-`などで変更せず、`rwx`を直接指定します。
入力方法は下記のサンプルコードをご覧ください。

![chmod(=指定) サンプルコード(加筆後).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/27c7f20a-ac25-24e2-94ce-f71862221493.jpeg)

| 記号3       |     内容    |
|:-----------:|:------------:|
| r          | read (読み取り) |
| w          | write (書き込み)|
| x          | execute (実行) |

![chmod サンプルコード 加筆後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/aba01079-90fb-9be7-675f-6b963e2c139a.jpeg)
サンプルコードでは `u`(Owner)の権限に`+`追加しました `x`(実行権限) を。
※ちょっと英語っぽい書き方ですが、順序が合った方が分かり易いと思ったので...笑

また、権限の変更に関しては別の記述方法もあります。
`chmod 数値(8進数) ファイル名`という記述方法です。


| パーミッション |数値|
|:------------:|:----:|
| r (読み取り) | 4 |
| w (書き込み) | 2 |
| x (実行)     | 1 |

付与内容を`rwxr-xr--`としたい場合は
| Owner | Group | Other |
|:-----:|:-----:|:-----:|
| rwx   | r-x   |  r--  |
| 421   | 4 1   |  4    |
| 7     | 5     |  4    |

`chmod 754 ファイル名`と入力するようになります。

![chmod サンプルコード(数値版) 加筆後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/9aeb9ed9-c731-3f88-f258-2b17bd118fdc.jpeg)

アルファベットを使用した指定を**相対指定**
数値を使用した指定を**絶対指定**と呼びます。

使い分けとしては既に存在するファイルに対して一部の権限変更を加える場合は**相対指定**をしようして、入力がシンプルなので**絶対指定**は全ての対象者で権限を変える時などは使い易そうな気がします。

また、権限に関して関連するコマンド入力方法として**スーパーユーザー**があります。
これまで解説した中でファイルの読み取り、書き込み、実行についてそれぞれ権限が設けられている事を述べてきました。
これはシステムの重要部分などは誰でも作業ができるとトラブルの原因にも成り得るので、権限を設けることで制限しています。
通常、権限が無いファイルに関しては実行などの処理ができませんが、**スーパーユーザー**としてコマンド入力すれば、実行することができます。
それが`sudo`コマンドで switch user and do の略となります。
`sudo コマンド`と入力すれば、管理者(root)として実行できます。
サンプルコード：`sudo mkdir /ディレクトリ名`
通常、/(ルートディレクトリ)直下にはディレクトリを作成することはできませんが、`sudo`コマンドを使うことで実行することができます。
`sudo`コマンドを使うと管理者のパスワードを聞かれますので、入力が必要となります。

## chown
chown は change owner の略です。
ファイルやディレクトリのユーザー所有権とグループ所有権を変更します。

`chown ユーザー ファイル名`と記入します。
ユーザーにはrootやユーザー名などの所有権を渡したい対象を入力します。
`chown ユーザー名:グループ名 ファイル名`の場合はグループも変更
所有権を渡したい対象をユーザーとグループで両方変更したい場合

オプションの使い方
`chown -R ディレクトリ名`
コマンドに`-R`を追加することでディレクトリとその中にあるディレクトリ及びファイルについて所有権を変更できます。

## ps
ps は prcess status の略です。

このコマンドを説明する前に**プロセス**について説明していきます。
いつも何気なくターミナルでコマンドを実行して結果を受け取っていますが、コマンドを実行すると下記の流れで処理が進められています。
１，コマンドを実行する 例：`yum install 〇〇〇`
２，`/bin/yum`という実行ファイルをCPUが見に行く
３，CPUは上記のファイルを実行する為にメモリ上に持っていく
※メモリ上に運ばれたプログラムを**プロセス**と呼びます。
４，CPUがプログラムを実行して**プロセス**を作る。

では、続いて`ps`コマンドを説明していきます。
`ps オプション有無`で入力・実行します。
このコマンドは実行中のプロセスを表示するコマンドです。
![ps サンプルコード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/312e6b22-3395-7560-5511-6e78355fdddf.jpeg)
サンプルコードの一行ずつが一つのプロセスを表しています。
`PID`がプロセスコード
`CMD`が実行中のコマンド名を表しています。

`ps aux`コマンド
全ユーザーのプロセスを詳細情報を合わせて表示してくれます。

## kill
kill は kill process の略です(略になってませんがっ)。

コマンドの説明をする前に前提知識として**ジョブ**について説明したいと思います。
`ps`コマンドの所で説明したプロセスはOSで管理されるのに対して、**ジョブ**はシェルによって管理されます。
※シェルはユーザーとLinuxカーネル(Linuxの核)の間で情報の橋渡しをします。

それでは実際に`kill`コマンドを説明していきます。
このコマンドはジョブやプロセスを終了させるコマンドです。

記入例
`kill %1` ジョブを終了させる為の書き方で `1`がジョブIDです。
※`%`を入れることで以降がジョブIDだと認識させます。
`kill 7985` プロセスを終了させる書き方 `7985`がプロセスIDです。
![Kill(プロセス) サンプルコード(加筆後).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/eb4b7ecb-d46e-c0d8-d255-664efec3c265.jpeg)

補足説明として、`kill`コマンドはシグナルを送信するコマンドです。
デフォルトの設定では`-TERM`という、終了を指示するシグナルを送信しています。
`kill 7985` 省略した書き方
`kill -TERM 7985` 省略無しの書き方

また、稀に`SIGKILL`というシグナルを使うこともあります。
このシグナルは強制終了を意味しています。

`kill -SIGKILL 7985` 通常の書き方
`kill -9 4965` `-SIGKILL`を数字に置き換えた書き方

## head
`head`コマンドは指定したファイルの先頭10行を表示するコマンドです。
`head ファイル名`として使います。
実行するとターミナルにファイルの先頭10行が表示されます。

役に立つオプション
`head -n 行数 ファイル名` 表示される行数を10行から変更できる
`head -c 文字数 ファイル名` 表示される行数を指定できる

## tail
`tail`コマンドは指定したファイルの末尾10行を表示するコマンドです。
`tail ファイル名`として使います。
実行するとターミナルにファイルの末尾10行が表示されます。

役に立つオプション
`tail -n 行数 ファイル名` 表示される行数を10行から変更できる
`tail -c 文字数 ファイル名` 表示される行数を指定できる


## 標準入力、標準出力、標準エラー出力
標準入力・出力とはプログラムが特に何もしてされていない場合に利用するデータの標準的な入出力元・先です。

| 名称        |     内容    |
|:-----------:|:------------:|
| 標準入力    | プログラムの標準の入力(通常はキーボードを介する) |
| 標準出力    | プログラムの標準の出力(通常はディスプレイを介する)|
| 標準エラー出力| エラーメッセージを出力(通常はディスプレイを使う)|

Linuxではコマンドの入出力先を抽象化することで入出力先を柔軟に変更することができる

## リダイレクト
リダイレクトとは先に説明した入出力先を変更する機能です。
- **入力のリダイレクト**
標準のキーボードの代わりにファイルから入力する機能
サンプルコマンド：`cat < /etc/hosts`
この場合、入力する内容を`/etc/hosts`というファイルにしています。
入力内容をcatに格納するコマンドになるので、`cat /etc/hosts`と出力内容は変わりありません。
何度も同じコマンドを使用する場合などは毎期コマンドを入力するのは大変手間なので、上のやり方でやると間違えも減ってやり易いです。
- **出力のリダイレクト**
コマンドの実行結果を画面に表示するのではなくファイルに保存する。
サンプルコマンド：`ls > result.txt` → `cat result.txt`
この場合、`ls`コマンドの出力結果を通常であれば画面に出力する所を`result.txt`というファイルに出力・保管しています。
そして、次の`cat`コマンドで内容を出力しています。
- **エラー出力のリダイレクト**
コンピューター内では標準入出力などをOSが識別する為に使用する識別子があります。

|  入出力    |     数値    |
|:-----------:|:------------:|
| 標準入力    | 0 |
| 標準出力    | 1 |
| 標準エラー出力| 2 |

`ls /test 2> error.txt`で`error.txt`にエラー出力内容を保存する
`2>`と入れることでエラー出力の内容が保存されます。
`>`と入力すると標準出力と判断されますので、結果が変わります。
※標準出力時の`1>`は`>`と省略することができます。

出力をまとめて処理することも可能です。
`ls / /test > result.txt 2>&1`
まとめて処理する場合は通常と入力が異なり、先にリダイレクトの内容を記入した後に `2>&1` と書きます。

また、`>`で処理するリダイレクトは上書き保存ですが、`>>`と入力することで追加保存をすることができます。
サンプルコード：`echo Good Morning! >> resutl.txt`

## パイプラインによるコマンドの連結
`|`をパイプラインと呼ぶのですが、Linux内のターミナルではこの`|`を使うことでコマンドを連結することができます。
サンプルコード
`ls /bin | grep system | less`と入力することで３コマンドを連結
`ls /bin`で`/bin`内のファイル等を出力して且つ
`grep system`で出力された結果に対して`system`を含む行だけ表示且つ
`less`でスクロールし易いように表示します。
これは凄い。役に立ちそう。絶対に役立つはずだ。

## おまけ お役立ちコマンド
`Ctrl + l` でターミナルに表示されている内容をリフレッシュできます。
文字化けしたファイルを開いたり、ログがごちゃごちゃして見難いなと思ったら試してみてください。
`Ctrl + d` でターミナルの強勢終了ができます。
文字化けしたファイルを開いた時に上の`Ctrl + l`でリフレッシュできないときは試してみてください。