Linuxについて[概要とコマンド]



# Linuxとは
UNIXから派生してつくられたられた基本ソフトウェア（OS）

### Linuxの仕組み
ソフトウェアは基本ソフトウェアと応用ソフトウェアに分かれるが、
基本ソフトウェアはさらに２つの領域に分かれる


#### カーネル
OSの中核部分
ハードウェア（PCなど）と直接やりとりするなど中心的な役割を受け持ち、
ハードウェアが違っても、プログラムが同じように動作するよう働く


#### ユーザランド
OSが動作するのに必要なカーネル以外の部分
ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群を指す


このようにカーネル、ユーザランドそしてハードウェアをまとめて広義のLinux
カーネルを狭義のLinuxと呼ぶ

###Linuxの操作

基本的にコマンド操作でありユーザランドで動作する

LinuxにX Windows SystemとGNOME、KDE、Xfceなどデスクトップ環境を導入する
とマウス入力による操作が可能となる

###シェルとは

対話型コマンド入力環境で入力されたコマンドを理解し実行する
大きく２つの機能があり、

* コマンド入力を受け付けること
* シェルスクリプトの実行
  
  シェルスクリプトとはコマンド入力を自動化するためのもので、１つのファイルに
  コマンドを１行ずつ記述する。
  
  作成したシェルスクリプトを実行することで、コマンドの実行を自動化する。

### ディストリビューション

Linuxをインストールするためのプログラムをまとめたものでこれを使うと簡単に
インストールが可能となる


#### ディストリビューター

ディストリビューションを開発する団体

Canonical(Red Hat,Debian,Projectを開発)が代表的なLinuxディストリビューターで

様々な団体からLinuxはリリースされ続けている

### パッケージ
LInuxに追加機能を提供するもの

応用ソフトウェアを簡単に追加できるよう、ディストリビューターがパッケージを作り提供している


### パッケージマネージャ

応用ソフトウェアを導入する場合、関連した応用ソフトウェアやライブラリが必要な場合があり、

依存したソフトウェアがさらに別の応用ソフトウェアに依存しているとなると、正しいインストールや
保管が必須となる。

また、バグの修正や改善などの更新が行われる場合は古いバージョンを削除し、新しいバージョンを
インストールするなど、これら操作は非常に困難で手間もかかる。

これら作業を簡単に行えるためのものがパッケージマネージャであり、Linuxディストリビューションには
必ず用意されている。

これでインターネットにつながっている限り最新の状態を容易に導入・更新できる。



# LinuxのDL

###DLに必要なもの

LinuxをDLするためにはディストリビューションであるCent OSをインストールする

Cent OSはインストール用DVDを用意してそこに入れる

* マシン本体
   いわゆるパソコン
   VirtualBoxなど仮想環境でCent OSをインストールすれば元のOSは消去されない

* 実装メモリ
* DVD光学ドライブ
   Cent OSの公式HPが配布しているISOファイルをDLし、Cent OSをインストールする

※ISOファイルとは
要はCDやDVDなどの中身を1つにまとめたファイルのこと
  
**これをイメージファイルなどと呼ぶ。**

* ハードディスク
  Linuxをインストールするためには約10GBの空きが必要
  また、Linuxはハードディスクを初期化してインストールされるので、ハードディスクをクリアにしていいもの、
  もしくはバックアップを取ってから作業を開始する

* キーボード、マウス、ディスプレイなど周辺機器




# Linuxのコマンド

## ファイル操作

#### ファイル

文書や画像などのデータをコンピュータ上に保存するための形式


#### ディレクトリ

複数のファイルをまとめたもの

### ファイルやディレクトリの参照

#### ls 

ファイル名やディレクトリ名を指定し情報を取得する

例えばディレクトリ名を指定した場合、その中にあるファイルやディレクトリ名の
一覧を取得できる

~~~
例）$ ls 
ダウンロード デスクトップ ビデオ 画像
テンプレート ドキュメント 音楽 公開
~~~


ちなみに*や?をワイルドカードとして使うこともできる

記号|意味|例|内容|
-|-|-|-
\*|任意の文字列を表している|ls\*.conf|confで終わるファイルがリスト表示される
?|１個につき１文字を示す|ls hosts.????|hosts.denyのように４文字で終わるファイルが表示される


#### ls [オプション] [ファイル]


#### オプションとは
コマンドにオプションをつけることで動作を変えることができる

#### lsオプション

　オプション　|意味|
-|-
-a|.で始まるファイル等全て（all）表示される|
-l|長（long）形式で出力
-t|最終更新時間（time）によってソートを出力
-r|逆順（reverse） にソートをして出力

オプション部分はまとめて使ったり、さらに順不同で入れ替えて表示しても同じ結果となる

~~~
$ ls-la
$ ls-al
$ ls-l-a
$ ls-a-l
~~~

**上記は全て同じ意味**

ただし、コマンドによっては順序と文法が細かく決まっているものもある



#### cp [オプション] コピー元 コピー先

~~~
$ cp src-file dst-file
~~~
* どちらもファイル名の場合
  src-fileのコピーとしてdst-fileを作成している

* dst-fileがディレクトリの場合
  src-fileファイルのコピーがdst-fileディレクトリの下にコピーされる
  

* cpオプション

オプション|意味
-|-
-i|ファイルの上書きコピーするなどコンピュータが確認のため問い合わせをする誤って上書きするのを防ぐ
-r|ディレクトリ内にある全ファイル•ディレクトリに対しコピーを行う
-p|元ファイルの情報を保存するなど古い情報を保持したままコピーを作成したい場合に使う



#### mv 移動元ファイル 移動先ファイル

移動元ファイルを移動先ファイルに移動することができる
また、名前の変更も可能

* mvオプション

オプション|意味
-|-
-i|ファイルの上書きコピーするなどコンピュータが確認のため問い合わせをし、誤って上書きするのを防ぐ
-f|mvは一部の処理を確認のため問い合わせするがそれを無視し、強制処理を行う



#### rm ファイル名

作成ファイルを削除する

* rmオプション

オプション|意味
-|-
-i|ファイルの上書きコピーするなどコンピュータが確認のため問い合わせをし、誤って上書きするのを防ぐ
-f|一部の処理を確認のための問い合わせを無視して強制処理する
-r|ディレクトリ内にある全ファイル•ディレクトリを削除する
## ディレクトリの操作

#### pwd 
階層構造となっているディレクトリにおいて、現在どの階層にいるのかを表示する

~~~
例）
$ pwd
/home/penguin
~~~
現在homeディレクトリの中のpenguinディレクトリにいるという意味
/ はディレクトリの区切りを示している


#### cd [ディレクトリ名]

現在いるディレクトリを変更することができる
cdの後にディレクトリを指定しない場合は、ホームディレクトリに移動する

#### mkdir [ディレクトリ名]

* mkdirオプション
　　　　ディレクトリの作成を行う

オプション|意味
-|-
-p|指定されたディレクトリの上位ディレクトリを作成する
  
~~~
$ mkdir -p dir1/dir2/dir3
~~~
dir1にはdir2が作られ、dir2にはdir3が作られる


#### rmdir [ディレクトリ名]

ディレクトリの削除を行う

削除する際はディレクトリ内は空でなければいけない


* rmdirオプション

オプション|意味
-|-
-p|指定した階層までのディレクトリを一括削除
   このコマンドがない場合は最下層のディレクトリのみ削除される



#### 特別なディレクトリ

記号|名前|意味
-|-|-
.|カレントディレクトリ|現在いるディレクトリ
..|親ディレクトリ|１階層上のディレクトリ
~|ホームディレクトリ|ユーザの作業開始位置となるディレクトリ
/|ルートディレクトリ|ディレクトリ階層の最上位


#### 絶対（パス）指定と相対（パス）指定

*  絶対（パス）指定
  最上位のディレクトリ(/)からディレクトリ•ファイル名を指定すること

~~~
/use/bin/XXX
~~~

* 相対（パス）指定 
  現在自分がいる位置から見てディレクトリ•ファイルを指定

~~~
../bin/XXX
~~~
## ファイルの内容を表示

* cat ファイル名


オプション|意味
-|-
-n|行番号を付加して表示できる


#### more ファイル名 と less ファイル名

catコマンドによりファイル内容を表示しても行数が多いと表示が流れてしまう

大体の場合、25行で設定されているので、これを超えると確認ができない


その時に画面制御を行なってスクロールを止めてくれる機能をページングといい、
それを実現するコマンドをページャという

代表的なページャに
moreとlessがある

*　moreコマンド

項目|内容
-|-
スペース|次のページに進む
b|前の１画面に戻る
f|次の１画面に進む
/単語|単語を検索しnキーで検索結果にジャンプ
q|ページャコマンドを終了

* lessコマンド

項目|内容
-|-
スペース|次のページに進む
b|前の１画面に戻る
f|次の１画面に進む
↑|前の行に進む
↓|次の行に進む
/単語|単語を検索しnキーで検索結果にジャンプ
q|ページャコマンドを終了







#### find パス -name ファイル名
ファイルがどこのディレクトリに存在するのか検索できる

~~~
例）
find /etc/-name hosts
find:~/etc/pki/CA/private`:許可がありません
...
...
...

/etc/hosts
/etc/avahi/hosts
~~~

これは/etc配下にあるhostsという名前のファイルを検索している

また、findはパスで指定した配下の全てのディレクトリを検索するので、
許可がないものについては一般ユーザには権限が与えられていないため、
適切な権限を持ったユーザへ切り替えが必要



##コマンドのパス

#### コマンドの実態もプログラムである

プログラムもファイルの一種であり、/binや/sbinなどプログラム用のディレクトリに配置されている
PATHという環境変数にプログラムが配置されているディレクトリが設定されている


* which コマンド名

コマンドのパスを調べるためのコマンド
ただし、PATH環境変数に含まれていないとエラーとなる
これは管理者権限が必要なコマンドへのパスは一般ユーザでは設定されていないためwhichコマンドでは
確認できないから

~~~
例）
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/linuxtext/bin

$ which cat
/bin/cat
~~~

上のコマンドではユーザが参照できるパスを確認しており
下のコマンドでcatコマンドが/bin配下に配置されていることがわかる
PATH環境変数内に/binが存在しているのでエラーは表示されない



## ヘルプ

* コマンド --help

コマンドの実行に使えるオプションを調べることができる

~~~
例）
$ ls --help
使用法：ls [オプション]...[ファイル]...
説明文がくる...

長いオプションに必須の引数は短いオプションにも必須です
-a, --all          説明文...
-A, --almost-all   説明文...
~~~


## マニュアル

* man コマンド名

Linuxにはオンラインマニュアルが含まれている

|オプション|意味
-|-
-k|`単語`が含まれるエントリ一覧を出力

~~~
例）
$ man lS
LS(1)                                 LS(1)                                                  
 名前
        ls,dir,vdir-ディレクトリの中身を表示する
 書式
        ls [OPTION]...[FILE]
 -l     ファイルのモード・リンクの数・所有者名・グループ名・（バイト単位の）サイズ・タイムスタンプ・
         名前を（１ 列形式で）書き出す。
         ...以下、説明文...
        
~~~


コマンドのマニュアルを調べることで名前、書式等やオプションの情報の他に



* 説明
　　　　　

プログラムに関する説明
* POSIX／GNUオプション
 　 プログラムで利用可能なオプション
* 関連項目
 　 関連するコマンドや他機能について
* 注意
 　 注意事項やバグの報告先などの情報が書かれてている

などが表示される


### セクション
マニュアル内容を分野ごとに分け指定したもの
lSのマニュアル内にあるLS(1)というのはISのマニュアルがセクション１にあるという意味

#### マニュアルのセクション

|項目|内容|
-|-
1|ユーザコマンド
2|システムコール
3|システムライブラリや関数
4|デバイスやデバイスドライバ
5|ファイルの形式
6|ゲームやデモなど
7|その他
8|システム管理系のコマンド
9|カーネルなどの情報

~~~
例）
$ man passwd

関連項目
          group(5),passwd(5),shadow(5)
~~~         

passwdコマンドのマニュアルを検索し、読み進めていくと、関連項目が出てくる
「セクション５にpasswdというエントリがあり参照できる」という意味


~~~
例）
$ man 5 passwd
PASSWD(5)          File Formats and Conversions          PASSWD(5)
NAME
         passwd - the password file
~~~

実際にセクション５のpasswdのエントリを見るにはこのようにコマンドする
同じエントリでも複数のマニュアルが表示された場合は、セクションを変更して
参照できる

## 標準入出力

Linuxのプログラムには、「1つの入り口と2つの出口」があり、
それぞれ
* 標準入力
   プログラムに入っているデータのことで、標準入力先は一般的にはキーボード

* 標準出力
  プログラムの実行結果を書き出す先のことを示し、
  標準出力は一般的にはプログラムを実行した端末のディスプレイ

* 標準エラー出力
  エラーメッセージを書き出す先のことを示し、
  標準エラー出力は一般的にはプログラムを実行した端末のディスプレイ


lsとコマンドを打った場合、カレントディレクトリのファイルとディクトリの一覧が画面上に表示される

このようにコマンドを実行した結果が画面上に表示されることを
**標準出力に出力された**と表現する

## リダイレクト

#### リダイレクト >

コンソールに標準出力された文字列はリダイレクトを使ってファイルに書き込むことができる

~~~
例）
$ ls > ls-output
~~~

リダイレクトコマンドを実行すると、ls-outputというファイルが作成され、lsを実行したときと同じ内容が含まれる
出力先を変更しファイルに出力を格納することができる

#### アペンド >>

すでにls-outputが存在しているときは、前のls-outputが削除されて新しいls-outputが作成されるので、
上書きせず追記したい場合はアペンドを使う


### catコマンドとリダイレクト

内容表示に使うcatコマンドでもリダイレクトを使うことで、自由な内容で
ファイルを作成することができる

~~~
例）
$ cat > cat-output
Hello
This is cat redirect.
（「Ctrl」Dを押す）
$
~~~

cat-outputファイルの中にHello This is cat redirect.を出力

<font color="red">※</font> Linuxではデータの読み込みが最後になると、「Ctrl」DはEOF(End OfF ile)を示すキーで、
データ入力の終わりを示す

### 標準エラー出力

~~~
例）
$ ls -l tekitou > ls-l-output（tekitouというディレクトリ内の詳細出力をlsloutputにリダイレクト）
ls: cannot access tekitou: そのようなファイルやディレクトリはありません
（tekitouというディレクトリが見つからなかったというエラーメッセージ）
~~~

tekitouというディレクトリが存在しなかった場合、「そのようなファイルやディレクトリはありません」
というエラーメッセージが標準出力される

~~~
例）
$ ls -l tekitou 2 > ls-l-output（エラー出力をls-l-outputにリダイレクト）
~~~

コマンド中で指定している"2"は、標準エラー出力を示しており、エラーメッセージは画面に現れず、
指定したファイルに出力される
標準出力は"1"を指定

~~~
例）
$ ls -l tekitou > ls-l-output
second 2 > &1
~~~

標準出力と標準エラー出力を1つのファイルに出力したい場合はこのように入力する

## パイプ

```
$ ls – l/usr/bin
```

例えばこの入力では、画面にファイル一覧が流れるが、/usr/binにはコマンドが
1000以上あるのですべてのコマンドを画面に表示しきれない

そこで

```
$ ls – l/usr/bin|less
```
コマンドとコマンドを「|（パイプ）」でつなぐことにより、パイプの前のコマンドを後ろのコマンドの標準出力とすることができる
lessコマンドをつなぐことで、ページング表示できるようになる


## grep

ファイルの中からデータを検索する
「| grep」とすることで標準入力から入ったデータに対して検索可能となる

#### grep [オプション] 検索条件 [指定ファイル]

指定ファイルは１つでも複数でもOK

```
例）
$ grep abc /etc/*

/etc/services:abcvoice-port   3781/tcp
```
/etc ディレクトリにあるファイルで abcという文字列を含むものを検索
している





###　正規表現
高度な検索条件を与える表現方法

記号|意味
-|-
^|行頭を表す
$|行末を表す
.|任意の一字を意味する
*|直前文字の０回以上の繰り返しを意味する
[…]|..の中の任意の一字を意味する
[^…]|..の文字が含まれないことを意味する
\|正規表現の記号をエスケープする


(使用例)

記号|意味
-|-
^a|aで始まっている行
b$|bで終わっている行
a.b|aとbの間に１文字入っている
[ab]ab|aもしくはbに続くab(aab、bab)
[^ab]ab|aもしくはbで始まらない（not）で、abが続くもの（例：xab、zab等）


```
例）
$ grep ^xy /etc/*

/etc/services:xyplex-mux   173/tcp
```
/etcディレクトリにあるファイルで行の先頭がxyで始まっているものを検索している

### grepコマンド

オプション|意味
-|-
-a|文字列を検索パターンとして扱う
-i|検索パターンと入力ファイルの双方で、英大文字と小文字の区別を行わない
-v|検索パターンとマッチしなかった行を選択する

```
例）
$ grep –i hostname /etc/*
```

/etcディレクトリにある、大文字又は小文字のhostnameという文字列を含むファイルを検索

```
例）
$ grep abc /etc/*| grep –v tcp
```
/etcディレクトリにある、abcという文字列を含むが、tcpという文字列は含まないファイルを検索

```
例）
$ ls /usr/bin/ |grep –e d$
```
ファイル名がdで終わるファイルを/usr/binから検索
このように標準入力からの入力をマッチさせることもできる




>参考書籍
>>『Linux標準教科書 v3.0.2』 LPI-Japan 2019年