初心者が調べた。shellとは

動機： bash、shellというものがなんなのか分からなかったので調べてみた。

自分の環境：

- OS   ：ubuntu14.04
- shell： bash

疑問:

- shellは何の為にあるのか
- shellが起動するタイミング
- ファイルが読み込まれる順番
- shellの種類

など

1-1から1-5のブロックに分けて書きました。

# まず、前提 1/2
　Linuxシステム(OS)とはカーネルを核としたプログラムの集合体であり、ユーザーはshellにコマンドを入力することによってカーネルのプログラムを実行する。
カーネルはシステムのリソース（CPU,HD,ネットワーク接続など）を管理し、アプリケーションがこれらのリソースを使って動作できるようにサポートする。
　shellはユーザーが入力した文字の行（コマンドライン）を読み取り、それを解釈してカーネルに伝える。カーネルはshellの要求に応えてプログラムの起動や制御を行う。Linuxでは標準的にbash（bourne again shell)というshellが標準的に使われている。shellは他にもいくつかある。

ユーザーはカーネルを直接操るのではなく、 あらかじめ用意されたインターフェイス（窓口）を通して、カーネルに対してコマンドの実行を要求します。このインターフェイスの部分がシェルである。

## 前提 2/2　Linuxとはカーネルとユーザーランドに分けれる
【カーネル】
カーネルは各端末のハードウェアの違いにも対応し、プログラムがどのハードウェアでも同じように動作する役割を持つ。
【ユーザーランド】
OSが動作するのに必要な、カーネル以外の部分のことで、ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群を指す。

![カーネルとユーザーランド.png](https://qiita-image-store.s3.amazonaws.com/0/133886/c7fe56a2-87a1-d819-84bc-ac4a68c9f0b3.png)


![カーネルとユーザーランド・詳細版.png](https://qiita-image-store.s3.amazonaws.com/0/133886/eb379df9-5d58-a748-a613-eb489e317ce3.png)

http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.0.0/ch02.html



# 1-1　shellは何の為にあるのか
　カーネルをユーザーが直接操作すると致命的なエラーが発生することがあるため、shellを使ってカーネルを操作する。
　カーネルは、コンピュータ上で様々な命令を実行する。
例えば）

- ファイル操作  
- プロセス操作  

など・・・

　shellはカーネルの中に、特別な関数（システムコール）として定義されていて、そのシステムコールをユーザーがコマンドラインを使って操作している。
　シェルへのコマンドはC言語で書かれたプログラムである。カーネルの機能を呼び出すのがshellの機能だけれどもshellにはCUIとGUIがあり、

- windowsだと
 - CUIがコマンドプロンプト
 - GUIがエクスプローラ
- ubuntuだと
 - CUIがbash（デフォルト）
 - GUIがノーチラス

である。
※Nautilusとはファイルマネージャであり，GNOME（グノ−ム）の上で動作する。
※GNOMEとはデスクトップ環境であり，X Window Systemの上で動作する。
※X Window Systemは，LinuxにGUIを提供するツールである。
http://language-and-engineering.hatenablog.jp/entry/20110617/p1

【シェルの役割】
  ・コマンドの受付
  ・シェルスクリプトの実行


# 1-2 shellの種類
- 【sh】（Bourne shell）
- 【csh】（c shell）
- 【bash】（Bourne Again shell）
- 【fish】（Friendly Interactive Shell）
- その他

【sh】（Bourne shell）：
　現在利用できるもっとも古いシェル。 AT&T のベル研究所で開発され、 開発者の１人であるSteven Bourne 氏にちなんで名付けられた。 色々なシェルの中で共通項的な位置にあり、 ほとんど全ての UNIX で利用できる標準的なシェルであるため、 シェルスクリプトの作成には B シェルがよく用いられる。

【csh】（C shell）：
　カリフォルニア大学バークレイ校の William Joy 氏が中心になって開発したシェルで、 C 言語に似た構文を持つことから、この名前が付けられている。 B シェルに比べ、ヒストリー機能やジョブ制御、 エイリアスなどの機能が付加されており、対話形式で使用する場合に便利である。

【bash】（Bourne Again shell）：
　MIT（マサチューセッツ工科大学）の Brian Fox 氏が作成したシェルで、 現在、GNU ソフトウェアの一部として配布されている。 bash は、元来 B シェル において貧弱であった、 ユーザーインターフェイスとしての機能を強化するため、 ヒストリー機能、エイリアスなどが追加されている。

【fish】（Friendly Interactive Shell）
fishは対話的利用・判り易さ・ユーザフレンドリさに重きを置いている。fishの最終目標は、簡単に発見でき、覚えられ、利用できるようなかたちで強力な機能を提供することである。fishの提供するタブ補完機能はユーザフレンドリかつ強力であり、全ての補完に対する簡易な説明や、ワイルドカードを含む文字列での補完や、たくさんのコマンドについて固有の補完を含む。

その他：
csh の拡張版である tcsh（TC shell）や、zsh、ksh などがあります。
shellは他にも山ほどある。
http://webcache.googleusercontent.com/search?q=cache:RYdotdNX1RUJ:www-kn.sp.u-tokai.ac.jp/com/computer/shell/shell.html+&cd=7&hl=ja&ct=clnk&gl=jp

# 1-3 bashが起動するまでに読み込まれるファイル

自分の環境での読み込みの順番（ubuntu14.04)
/etc/profile →　~/.bashrc

参考）bashの設定ファイルの読み込みが複雑すぎて混乱する
http://d.hatena.ne.jp/pasela/20090209/bash

デフォルトではディストリビューション毎にbashが読み込まれるファイルの順番が違うということを先日聞いた。
聞いた話続きで、curlというコマンドは一回しか実行されない想定なので、なにかうまく行かなくて、何度も実行すると同じpathなどが何度も設定されるらしい。（自分がそうだった。同じpathが何個もbashrcに設定されていた。同じパスを見つけては、消して・・・をやった。）

# 1-4 ログイン
ユーザーがLinuxにログインするとその直後からshellコマンドが使える。

ログインシェルとインタラクティブシェルという言葉があるが、
ログインシェルはいつも使っているコンソールのシェルで、
インタラクティブシェルは、一時的にシェルを切り替えて使うそのシェルの事を言ってるんだと思う。
インタラクティブモードと言ってる人もいたのでそんな感じだろう。
なので普段使っているコンソールのシェルをログインシェルというのだろう、
それに対比させて一時的にシェルを切り替えて使った時にそのシェルについては、
インタラクティブシェルという呼び方をしてるということだろう。


# 1-5 コマンドの類
#### 自分が使っているshellを確認するコマンド

\$ echo $SHELL

#### 現在の自分のマシン環境で使用可能なシェルの一覧を見るコマンド

$ cat /etc/shells

#### シェル環境を設定する

「/etc/passwd」という設定ファイルで、自分のログイ ンシェルを確認、もしくは直接変更することができます。

#### 環境変数ってなに?　
windowsの例）
PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;D:\WINDOWS\SYSTEM

よくパスを通すとか言うけどそのことだろう。
→　pathを設定すること　→　変数と言ってるんだから一箇所にまとめて書いてるんだろう。
コマンドラインでecho $PATHって書くとpathがずらずら出てくる


#### 環境変数をみるコマンド

$ export

#　それでshellとは

![カーネルとユーザーランド・詳細版.png](https://qiita-image-store.s3.amazonaws.com/0/133886/eb379df9-5d58-a748-a613-eb489e317ce3.png)

　shellとは、ユーザーランドで動作するアプリケーション。~~OSのカーネルと呼ばれるプログラムにアクセスするための窓口。カーネルに直接アクセスするのではなく、窓口に向かってコマンドを叩いて自分のしたいことを問い合わせる。そんでその結果をもらう。窓口、つまりshellとは上図のシステムコールの部分と理解した。~~
それから、shellは~~システムコールも~~自作できる。
~~シェルはユーザーからのコマンドを受付け、カーネルを操作する。~~
システムコールはshellやライブラリから要求を受付け、カーネルを操作する。~~その為、システムコールはAPIとも呼ばれる。~~



プロセス、プログラム、システム・コール、ライブラリ
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2002/2002-04-15/

※間違い、ニュアンス違い等ありましたら、教えて頂けるとありがたいです。