【黒い画面恐怖症向け】Linuxとかシェルとかざっくり知りたいのでゆるく図解した

## はじめに
今回作成したいのはこんなファイルです。

![200216_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/75b36977-69be-9246-dfe3-9be8a11a5f0c.png)

「実行されると**アプリサーバーにJSONを送る**だけの**バッチ**」です。

curlコマンド使うといいよ！とのことだったのですが、自分はcurlコマンドはおろか、バッチ（→シェルファイル）を作るのも初めてだったので、シェルやLinuxコマンドの触りの部分を勉強しました。

今までHTMLやCSS、ちょこっとJavaを触っていた人間なので、Linuxコマンドは超初心者です！
勝手が違っていろいろびっくりしたので、備忘録としてまとめておきます。

ログディレクトリを無邪気に `-rm -r` して以来黒い画面は死ぬほど苦手なのですが、バッチ作ったら少しだけ和解できた気がしないでもないので、黒い画面に親を殺された・村を焼かれた皆さんの理解の一助になれれば幸いです。

この記事では、カーネルやシェルと聞いてもピンとこない人類向けに、ざっくり下記内容を説明します。

- Linuxカーネル
- シェル
- シェルスクリプト
- バッチとシェル

## シェルを学ぶ前に ： カーネルとシェルとは？

シェルとは、**Linuxカーネルのインターフェースとなっているソフトウェア**のことです。

…Linuxカーネル？

＝＝＝＝＝＝＝＝＝＝

→「Linuxカーネル？　CPUなどのハードウェア管理やコマンド実行などのプロセス管理をする、LinuxOSの核の部分でしょ？」と思った人はAを読む。

→「Linuxカーネル？　何それさんだーす？」と思った人はBを読む。

＝＝＝＝＝＝＝＝＝＝

A：Linuxカーネルのことなんか分かってるよ！という人はこの先3000文字を読む時間がもったいないので、ブラウザバックするか、コメ欄に美味しいラーメン屋の情報でも書いておいてください！

B：ぜひこの記事を読んで一緒に勉強しましょう！！！！

＝＝＝＝＝＝＝＝＝＝

再掲になりますがLinuxカーネルは、CPUなどのハードウェア管理やコマンド実行などのプロセス管理をする、LinuxOSの核の部分です。
（Linux以外のOSにもカーネルやシェルはあると思いますが、今回は[LinuxOSの本](https://www.sbcr.jp/product/4797380941/)を読んだのでLinux前提で話します…！）

![200216_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/1f284170-bc89-1bcd-2315-a5bce4682c28.png)

Linuxカーネルは直接コマンド入力で操作できるものではありません。コマンド実行や入出力先の指定などのユーザーインターフェースとしてシェルが存在するのです。

例えばmacOSのターミナル（黒い画面）を開くと、デフォルトで以下のような文言が表示されています。

```
Last login: Sun Feb 16 15:49:26 on hogehoge
hoge@localhost ~ % 
```

これは、シェルが表示しているプロンプトです。シェルというソフトウェアがコマンド入力を待っている状態になっています。
（上記はmacOS Catalinaを使用しました。デフォルトシェルはzshです。
プロンプト表示はbashの場合 `~ $`だったり、ユーザー名ホスト名の部分は端末によって異なります）

## シェルスクリプトとは？

macOSのターミナルや、フリーの端末エミュレータ（Tera Termなど）の「黒い画面」を用いると、コマンドラインから直接シェルに指示を与えることができます（**対話型操作**、インタラクティブ操作）。

一方、多くのプログラミング言語同様、シェルコマンドもあらかじめファイルに記述しておいて、そのファイルをシェルが読み込むことで起動する、という使い方もできます。そのように用意しておいたファイルをシェルスクリプトといいます。

先ほどの図に例示したように、シェルにはsh, bash, csh, dash, zshなど[様々な種類](https://ja.wikipedia.org/wiki/Unix%E3%82%B7%E3%82%A7%E3%83%AB#%E5%88%86%E9%A1%9E)があります。

[『新しいLinuxの教科書』](https://www.sbcr.jp/product/4797380941/)では、現在シェルスクリプトとして用いられるのは主にshかbashですが、以下の理由からbashがおすすめとのことです。

- shはLinuxのディストリビューション[^1]ごとに実装が微妙に違う
- shは古くからあるため、シェルスクリプトを書くうえで必須機能が少ない
    - 1の足し算でさえ外部コマンドexprを使用する必要がある

また、今回使用したいcurlコマンドも、[shだとevalコマンドを挟む必要がある](https://qiita.com/yoshikingt/items/58493af94d41dff348d6)ようです。もどかしいので、手軽に始めるならbashの方がいいんじゃないかなと思います！

[^1]: ここでは詳しく説明しませんが、Linuxのパッケージのことです。Linuxカーネルの他に、最初から使えるコマンド群やアプリケーションなどが同梱されており、それぞれ少しずつ異なります。同じ漫画を買っても、購入店舗によって特典でついてくるポストカードやシールやフィギュアなどが少しずつ異なる…というイメージでしょうか？　よく聞く具体名は、UbuntuやCentOSなど。

## バッチとシェル
すっかりシェルシェル言っておりますが、
「そういえば自分、冒頭で「バッチ」作った言うたやないか。バッチどこ行ったんや？　バッチとシェルは同じものなんか？」
と心の中の誰かからツッコミが入りました。

そういえば、自分も「バッチ」を作ってくれ、と言われましたが、実際に作ったのはシェル（bashを用いたシェルスクリプト）だったので、はて？となりました。

ここまで見てきたところ、「シェル」には以下のような意味がありました。

1. カーネルを包むインターフェースソフトウェア
1. シェルスクリプトの省略形（shとかbashとかzshとかの総称）
1. シェルの種類の一つである「sh」（省略せずにいうとBourne Shellというそうです）

![200217_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/a3bd361e-ce34-00e2-c91a-2b1b905d3caa.png)

同じように、「バッチ」にも様々な意味があります。

### 1. バッチ処理

> コンピュータで1つの流れのプログラム群（ジョブ）を順次に実行すること。
> あらかじめ定めた処理を一度に行うことを示すコンピュータ用語。
> 反対語は対話処理・インタラクティブ処理またはリアルタイム処理。
[バッチ処理 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86)

先ほど出てきた、「「黒い画面」から直接シェルにコマンドを打ち込む」行為は**対話型操作**だったのに対し、**バッチ処理**はあらかじめ定めた処理を一度に行うことを指します。
つまり、シェルスクリプトをあらかじめ定められた条件で起動させ処理を行うことも、「バッチ処理」です。

![200217_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/ade9573e-7de6-18b8-068a-29396a76cbc1.png)

（あくまで図はイメージです。普通はバラバラの拡張子でジョブ作らないんじゃないかな…）

### 2. バッチファイル
> MS-DOS、OS/2、Windowsでのコマンドプロンプト（シェル）に実行させたい命令列をテキストファイルに記述したもの。
[バッチファイル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)

これは機能としてはシェルスクリプトにそっくりですね。スクリプト言語としては仲間ですが、バッチファイル≠シェルスクリプトファイルです。
例として、ごくごく単純なHello Worldで見比べてみましょう。

##### バッチファイルのHello World

```
@echo off
echo Hello World
pause > nul
```

##### シェルスクリプト（bash）のHello World

```
#!/bin/bash
echo "Hello World"
exit 0
```

echoコマンドなど、いくつか類似のコマンドはありますが、基本的に別形式の言語であることが分かりますね。
自分もコマンドプロンプトで[ls](https://eng-entrance.com/linux_command_ls)してキィィってなること、[よくあります](https://qiita.com/kfjt/items/a51fa60eb8f568f16a58)。

超簡単に見分ける方法としては、拡張子が違います。

- バッチファイル：.bat
- シェルスクリプトファイル：.sh

ね？簡単でしょ？（これ以上詳しく聞かないでください泣いてしまいます、の意）
## おわりに
o(･\_･ = ･_･)o　＜　アレ〜？curlコマンドどこ〜？

本当はこの後、[よく使うLinuxコマンド](https://qiita.com/sukebeeeeei/items/a07743279ae86effe1ca)を説明して、curlコマンドを説明して、オプションをいくつか説明して、実際に作ってみてハマったところの紹介…と行きたかったのですが、

既にここまでで文字数がだいぶ増えてしまったので、今回はここまでとします！

これでも[UNIX](https://eng-entrance.com/unix_linux)とか[ディストリビューション](https://eng-entrance.com/linux-distribution-compare)とかだいぶ端折って書いたので、興味がある人はリンク先に飛んでみるなどしてみてください！

お読みいただきありがとうございました。