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

【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門uchan_nos
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発日本マイクロソフト株式会社
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いたAkihiro Kuwano
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門Yuichi Ito
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Hiro H.
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 

What's hot (20)

【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 

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
 

入門 シェル実装