SlideShare a Scribd company logo
1 of 37
Download to read offline
入門 シェル
@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

What's hot

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたKohei Nakamura
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていることonozaty
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割Recruit Lifestyle Co., Ltd.
 
トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話Tier_IV
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 

What's hot (20)

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 

Similar to 入門 シェル実装

シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)icchy
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話侑弥 濱田
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門icchy
 
Power shellmemo
Power shellmemoPower shellmemo
Power shellmemoytanno
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介Akira Tanaka
 
FOLIOのコードを動かしてみた
FOLIOのコードを動かしてみたFOLIOのコードを動かしてみた
FOLIOのコードを動かしてみたFutoshi Tanuma
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Debian Multiarch Support
Debian Multiarch SupportDebian Multiarch Support
Debian Multiarch SupportKeisuke Nakao
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Kei IWASAKI
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境Fumihito Yokoyama
 
簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話yokoda_toshiaki
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集Wataru NOGUCHI
 
.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLI.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLIkeitasudo1
 

Similar to 入門 シェル実装 (20)

シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
Fabric Essentials
Fabric EssentialsFabric Essentials
Fabric Essentials
 
Power shellmemo
Power shellmemoPower shellmemo
Power shellmemo
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
FOLIOのコードを動かしてみた
FOLIOのコードを動かしてみたFOLIOのコードを動かしてみた
FOLIOのコードを動かしてみた
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Debian Multiarch Support
Debian Multiarch SupportDebian Multiarch Support
Debian Multiarch Support
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
jenkinsで遊ぶ
jenkinsで遊ぶjenkinsで遊ぶ
jenkinsで遊ぶ
 
Open modeler
Open modelerOpen modeler
Open modeler
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 
.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLI.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLI
 

入門 シェル実装