SlideShare a Scribd company logo
入門 シェル
@genya0407
自己紹介
自己紹介
● @genya0407
● 京都大学 熊野寮 在住
● CAMPHOR- (元)運営メンバー
○ 4月から東京で就職
● 最近よく使う言語
○ Haskell
○ Rust
○ Ruby
● 最近バズったもの
○ 熊野寮でマイニングを禁止した話
○ ファストフード検索
本題
Question
● シェルを知っている?
● シェルを日常的に使っている?
● シェルの作り方を知っている?
本トークの概要
シェルを使っている人に「自分にもシェルが作れそう!」
という気持ちになってほしい
※ UNIX系OSを仮定
● Mac
● Linux
入門 シェル
入門 シェル実装
● シェルの復習
● シェルとOS
● シェルの実装
● デモ
本トークにおける「シェル」
● 文字ベースでOSを操作するアプリケーション
● コマンドを実行できる
● シンプルなコマンドの組み合わせ
→複雑な操作を実現
シェルの機能
$ cat members.txt
$ cat members.txt | grep genya0407
コマンド実行
パイプ
リダイレクト
$ gcc hoge.c && ./a.out
その他 制御構文,変数など
$ ls hoge || mkdir hoge $ if $A == $B; then
touch $A
fi$ mkdir hoge; cd hoge
本トークで解説
実質プログラミング言語
シェルの ”本質” ではない
→ 割愛
自作シェルには一部実装
$ ls > files.txt
時間の都合上 割愛
● シェルの復習
● シェルとOS
○ プロセス
○ カーネル
○ システムコール
● シェルの実装
● デモ
シェルとOS
● OS:コンピューターを管理するソフトウェア
● シェルの実装に使うOSの機能を説明
○ プロセス
○ カーネル
○ システムコール
「プログラムの動作中のインスタンス」 - Wikipedia
プログラム プロセス
プロセス
シェルも1つのプロセス
プロセスには制約がある
$ python main.py プロセスが起動
プロセスの制約
ファイルの読み書き
ネットワークアクセス
他プロセスとのやりとり
プロセスの起動
プロセスは,自分の「外部」にアクセスできない
→ カーネルにお願いする
カーネル
カーネル:
 OSの中核にある
 「特権」を持つ
 プログラム
特権:
- ネットワーク
- ファイルへのアクセス
- プロセスの管理
カーネル
プロセス プロセス プロセス プロセス
ネットワーク
ファイル
カーネルにお願いする手段
 =システムコール
システムコール
カーネル
プロセス プロセス プロセス プロセス
ネットワーク
ファイル
システムコール:
 プロセスがカーネルに
 「お願い」する手段
● open
● read
● write
● pipe
● fork
● exec
● wait
● select
● mmap
● chdir
● dup
● exit
etc...
● ネットワーク
● ファイル
● プロセス間通信
OSの機能のまとめ
● プロセスは「外部」に干渉できない
● カーネルは全ての権限を持つ
● プロセスはシステムコールで外部に干渉する
● シェルの復習
● シェルとOS
● シェルの実装
○ コマンド実行
○ パイプ
● デモ
シェルの機能
$ cat members.txt
$ cat members.txt | grep genya0407
コマンド実行
パイプ
リダイレクト
$ gcc hoge.c && ./a.out
その他 制御構文,環境変数など
$ ls hoge || mkdir hoge $ if $A == $B; then
touch $A
fi$ mkdir hoge; cd hoge
本トークで解説
$ ls > files.txt
割愛
$ cat members.txt
$ cat members.txt | grep genya0407
コマンド実行
パイプ
コマンド実行
$ cat members.txt
● 例はcatプログラムを実行
● シェルの外部にあるプログラムを呼び出す
(catはシェルのソースコードに含まれていない)
● シェルもプロセスの1つ
● プロセスの制約:
自分の「外部」にはアクセスできない
どうやって外部プログラムを実行する?
→ forkシステムコール
  execシステムコールを使う
fork と exec
fork:自分(プロセス)のコピーを作る
exec:他のプログラムに「変身」する
fork
exec
forkしたい!
execしたい!
コマンド実行の実装
fork
forkしてexec
exec(“cat”)
終了
次のコマンドを待つ
$ cat members.txt
シェル
cat
誤ったコマンド実行の実装
forkせずにexec
exec(“cat”)
終了
$ cat members.txt
シェル cat
コマンドを1つ実行するたびにシェルが終了する
コマンド実行のまとめ
fork + exec → コマンド実行
$ cat members.txt
$ cat members.txt | grep genya0407
コマンド実行
パイプ
パイプ
$ cat members.txt | grep genya0407
● 左のコマンドの出力を,右のコマンドに入力する
● プロセス間での情報のやりとりが必要
どうやって他のプロセスと通信する?
→ pipe システムコール を使う
● プロセスの制約:
他プロセスに干渉できない
pipe と pipe システムコール
pipe
pipe
pipe
● pipe:
OSの機能.プロセス間の通信手段.
● pipeシステムコール:
パイプを作成する
パイプの実装
pipeを作ってforkしてexec
シェル
$ cat members.txt | grep genya0407
pipe
fork
pipeを閉じる
次のコマンド
を待つ
exec
exec
cat
grep
終了
終了
fork
誤ったパイプの実装
forkしてpipe
シェル
$ cat members.txt | grep genya0407
fork
次のコマンドを待つ
pipe
pipe
別のパイプになる
 →通信できない
パイプのまとめ
fork + exec + pipe → パイプ
$ cat members.txt
$ cat members.txt | grep genya0407
コマンド実行
パイプ
● シェルの復習
● シェルとOS
● シェルの実装
● デモ
自作シェルのデモ
$ cat members.txt
$ cat members.txt | grep genya0407
コマンド実行
パイプ
リダイレクト
$ gcc hoge.c && ./a.out
その他 制御構文,環境変数など
$ ls hoge || mkdir hoge $ if $A == $B; then
touch $A
fi$ mkdir hoge; cd hoge
$ ls > files.txt
実装済
未実装
解説済
コマンドのリクエスト?
まとめ
まとめ
● 今回話したこと
○ シェルは文字ベースでOSを操作するアプリケーション
○ シェルを作るにはプロセス,カーネル,システムコールへの理解が必要
○ シェルは自作可能!
○ “車輪の再開発” は楽しい!!
○ 「ぼくがかんがえたさいきょうのシェル」を作ろう!!!
● 今回話さなかったこと
○ リダイレクト,制御構文,環境変数,ビルトインコマンド
○ パーサーの実装方法
○ タブ補完の実現方法
○ 本当にシェルを作りたい人はあとで聞いてください
おわり
Thank you !
Any Questions ?
付録
● デモで動かしたシェルのソースコード
○ genya0407/hash-demo

More Related Content

入門 シェル実装