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
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Yasutaka Kawamoto
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話yaegashi
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDeleteYu Yamada
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 

What's hot (20)

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 

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
 

入門 シェル実装