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

TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 

What's hot (20)

TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
Raft
RaftRaft
Raft
 

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
 

入門 シェル実装