Linuxとコマンドが苦手な人間が贈る、ターミナルの違いとコマンドについて

記事を書くにあたっての経緯
-

Linux…エンジニアの登竜門ですが、過去に環境設定で心折れて苦手になってしまいました。
Linuxといえばコマンド。でも、「コマンドなんか使わなくても便利なGUIツールがこの世にはたくさんある！」と思って、ほとんど触りませんでした…
ですが、プログラミングにおいて切っても切り離せず、何かしらのエラー解決を紹介している記事の9割はコマンドでの処理を記述しています。

エンジニアと名の付く仕事をしているのですから、Linuxが苦手でも最低限コマンドには慣れておかないと仕事になりません。「苦手意識は知らないことが原因で起こる」と言いますから、この機会に「ちょっとわかるようになってきた」のレベルに寄れるようにしようと思います。

これは誰に向けた記事か？
-
Linux初心者やコマンドに対して苦手意識がある人に向けています。

Linuxとは
-
私のダントツ苦手なあいつ、Linuxとはそもそも何なのでしょうか。

結論からいえば、OSです。
PCでいえばWindowsやMac OS、iPhoneでいえばiOS、XperiaでいえばAndroid OS。それらと同じ存在ですね。OSとは、ユーザとソフトウェアとハードウェアの仲介人です。
例えば、
ユーザが「テキストファイルの保存ボタンをクリック」 → OSが「データを保存して」と命令 → 記憶媒体にデータを保存
というように、私たちユーザがしたいことをPCやスマホなどのコンピュータに指示してくれるんですね。
このOSがいなければコンピュータはただの箱になってしまいます。

では、そのLinuxは他のOSとは何が違うのでしょう？

#### 特徴1：オープンソース
オープンソースというのは、ソフトウェアを構成しているソースコードを無償で一般公開しているものを言います。WindowsOSはwindowsPCを買わないと使えないですし、iOSはiPhoneを買わないと使えませんが、Linuxは誰が使ってもお金がかかりません。
また、勉強にWindowsのOSを触って壊してしまったらもうそのPCが使えなくなるリスクがありますが、Linuxは壊しても大丈夫です。またダウンロードして一からやり直せます。

#### 特徴2：開発・配布
オープンソースはソースコードを自由に書き換えられるのがメリットです。
なので、これをベースに新しいOSを作ることができます。
Android OSもLinuxをベースに作られたものだそうです。OSとはいろんな機能を持ちますから1から作るのはとても大変です。それらのベースの機能を持っているなら一気に作りやすくなりますね。

#### 特徴3：コストを抑えてサーバを用意できる
たとえばwebサービスを立ち上げるのにはファイルサーバ、DBサーバ、Webサーバ、アプリケーションサーバ、メールサーバ…など、多くのサーバが必要になります。そして、このサーバを動かすのにもOSが必要です。有料のOSをたくさん用意するとなると費用が掛かりますが、Linuxは無料なのでその分のコストカットができます。

ターミナルについて
-
次にコマンドを打ち込むあの黒い画面、ターミナルについて解説しましょう。
私はWindowsユーザでgithubの登録とVSCodeを入れているのでPCには
・コマンドプロンプト
・powerShell
・Git bush
・ターミナル（VSCode）
の4つが入っています。これらは何が違うのでしょうか？

#### コマンドプロンプト
こちらはWindows標準搭載のターミナル。
詳しいことは大塚商会さんが書いてくれています。

https://mypage.otsuka-shokai.co.jp/contents/business-oyakudachi/words/powershell.html

コマンドプロンプトはLinuxなどと比べると、
・シェル（ユーザーからのコマンドをカーネルが理解するように通訳をするプログラム）機能が弱く、使えるコマンドが少ない
・命令処理が長くなってしまう
といった欠点があるようです。
たしかにコマンドプロンプトでLinux使っているときのノリでコマンド打ちこんで、「そんなコマンドないよ」ってエラー吐かれた経験がありました。そういうことか…

#### powerShell
こちらもWindows標準搭載のターミナル。
Windows7から登場した、コマンドプロンプトの進化版みたいなものです。
こちらも大塚商会さんが解説してくれています。

> コマンド・プロンプトとPowerShellは、基本的な役割は同じだが、コマンド・プロンプトはシステムに対してコマンドを使用して命令するのに対し、PowerShellでは基本的に「コマンドレット」と呼ばれる命令を使用する。コマンドレットとは、PowerShellで利用可能なコマンドのことである。標準で129種類提供されており、コマンドレットを組み合わせることで、従来、コマンド・プロンプトやWSHでは実現不可能あるいは実現が難しいとされていた処理が、限りなく短いコードで実現可能になった。また、コマンドレットは「動詞-名詞」という一貫した命名規則に従っているので、名前から直感的に機能が想像できることも特長である。

つまり、PowerShellには「コマンドレット」さんという、
今までコマンドプロンプトさんにはできなかった難しい命令を簡潔に、また大量にだせる優秀な通訳兼司令官がいるということですね。
Windowsでどっちを使うか悩んだら、命令処理が優位に立っているPowerShellを使って問題ないでしょう。


#### Git bush
Windowsでgithubを扱うにあたって外せないGit bushですが、これについては下記がわかりやすかったです。

https://and-engineer.com/articles/YUBDBBAAACQAqlJd

Git bushとはGit for Windowsに同梱されているもの。
そもそもbushって何なのかというと、LinuxやMacで命令文を記述したり、簡単なスプリクトを組むときに使うシェルの1つで、「シェルプログラム」などと呼ばれます。
「.sh」という拡張子で、本来、Windowsではこのシェルスクリプトは扱えません。だからLinuxよりできることが少ないんですね。

でも、Git for Windowsを導入したことに、このシェルスクリプトがWindowsでも扱えるようになりました！
WindowsのシェルをLinuxOSと同等に戦えるようにしてくれるのが
Git bushという存在だということですね。

##### 余談
みんなお馴染みGitについては下記のように記載されていました。
> Git BashのGitとは、プログラム開発で用いるバージョンコントロールシステムを指します。GitはLinuxのソースコードのバージョンコントロールを行う目的で開発されました。Gitは大規模プロジェクトで用いるために、全履歴がネットワーク全体で利用できます。

もともとはLinux用だったんですね。
誰がいつ、どんなことをしたか、どんな変更がされたのかが分かる機能がgit。
そのgitを用いたwebサービスがgithub。BitbucketやBacklogも同じgitの機能が使えるwebサービスです。


#### ターミナル（VSCode）
VSCodeとは正式名称をVisual Studio Codeといい、マイクロソフトが開発したオープンソースのコードエディタとなります。ただコードを書くだけのエディタではなく、githubとの連携やコマンドの実行なども可能です。Git for Windowsを入れたことにより、このVSCodeのターミナルもLinuxと同等の力を持っている上に、添付画像のように使うターミナルの選択が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489679/e29caed6-144e-9bc3-ef49-c69929acc0c2.png)
できることが幅広いし、ショートカットキーも直感的に使えるので、今まで紹介したどのターミナルよりも好きです。


よく使うコマンド
-
ここからはよく使うコマンドを紹介します。
今回はVSCodeのターミナルで「Git Bush」を選択して操作していきます。
#### __・現在地の確認__ ・・・`pwd`
```
$ pwd
/c/親ディレクトリ名/今いるディレクトリ名
```

#### __・移動__ ・・・`cd 移動したい場所`
```
$ cd /c/Users/*****/デスクトップ
$
```
 cdコマンドは後ろに移動先のパス名を書く必要があります。今回は「CドライブにあるUsers/*****/デスクトップ」が移動先になります。

デスクトップに移動したので、ここでファイル作成してみましょう。
#### __・空のファイル新規作成__ ・・・`touch ファイル名`
```
$ touch test.text
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489679/743dba93-793b-173a-a548-ea6306168b00.png)
このようにファイル作成ができました。でも、ファイルができたか毎度エクスプローラを開いて確認するのは手間ですよね。こんな時は`ls`コマンドを使いましょう。


#### __・ファイルの一覧表示__ ・・・`ls`
```
$ ls
laravelapp/       　　　 typescript/        Zoom.lnk*        
'Docker Desktop.lnk'*    test.text
```
私のデスクトップにあるディレクトリ・ファイル・アプリが表示されました。さきほど作った「test.text」も存在していますね。
・後ろに「/」がついている→ ディレクトリ
・後ろに「*」がついている→ アプリ
・後ろに何もついていない→ ファイル

コマンドには、オプションという細かい動作を指定できる技があります。
lsにもたくさんのオプションがありますが、今回はよく使う2つのオプション「-a」と「-l」をご紹介。この2つは合わせて使うことが多いです。
```
$ ls -la
./
../
'Docker Desktop.lnk'*
laravelapp/
test.text
typescript/
Zoom.lnk*
```
「-l」はそのファイルは誰が所有者なのか、その所有者の権限は何か、そのファイルは書き込みができるのか、読み込みのみなのかなど、細かな情報が一緒に表示されます。
「-a」は名前が . (ドット) で始まるファイルも表示することができます。
「./」はカレントディレクトリ、「../」は親ディレクトリを意味しています。

今度は「test.text」を編集してみましょう。
#### __・ファイルの編集__ ・・・`vi ファイル名`
```
$ vi test.text
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489679/53c61362-6290-58d0-91c9-b152d1b3922d.png)
添付画像のように「～」がいっぱい出てきました。これで「test.text」が開かれた状態です。
ただ、viコマンドで開いてもすぐに編集はできません。
「これから編集しますよ」とコンピュータに教えるために「i」（インサートの意味）を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489679/60cbbb9b-7aeb-b8e9-875c-1cf238777dec.png)
好きなように編集して「Esc」キーを押します。（インサート終了の意味）
保存と終了をまとめて行いたいので、「:wq」と打ち込みます。（保存したくないときは「:q」と打ち込めば大丈夫です。）
再度、「vi」コマンドでファイルを開けば、先ほどの編集内容が表示されるはずです。

今度はこのファイルを別のディレクトリに入れたいので、まず、ディレクトリを作成しましょう。
#### __・ディレクトリの作成__ ・・・`mkdir 作りたいディレクトリ名`
```
$ mkdir test_directory
$ ls
laravelapp/       　　　 test_directory/        typescript/        Zoom.lnk*        
'Docker Desktop.lnk'*    test.text
```

次は「test_directory」にファイルを移動させます。
#### __・ファイル移動__ ・・・`mv 移動させたいファイル 移動させたい場所`
```
$ mv test.text test_directory
$ cd /test_directory
/c/Users/*****/デスクトップ/test_directory
$ ls
test.text
```
ファイルが入っていますね。今度はコピーしましょう。

#### __・ファイルコピー__ ・・・`cp コピー元ファイル名 コピーされたファイル名`
```
$ cp test.text test_2.text
$ ls
test.text  test_2.text
```

今度はファイルとディレクトリを削除してみましょう。
#### __・ファイル削除__ ・・・`rm`
削除対象を間違えると怖いですよね。
「i」オプションをつけると、カレントディレクトリのファイルを確認しながら消してくれます。
「rm: remove regular file 'test.text'?」と聞かれるので、「はい」なら「y」「いいえ」なら「n」と打ち込みます。
```
$ rm -i test.text
rm: remove regular file 'test.text'?  y
/c/Users/*****/デスクトップ/test_directory
$ ls
test_2.text
```
ディレクトリ内のファイルをすべて消したいけど数が多い…という場合は`rm -r *`と打ち込んでみましょう。ディレクトリ自体を消したい場合は`rm -r ディレクトリ名`とします。この場合は「test_directory」を消したいので、一つ上の階層に移動（`cd ../`）してから実行してください。


#### 随時追加していきます。