Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Perl で作る tiny shell
Search
Kei Kamikawa
June 23, 2018
Programming
3
3.8k
Perl で作る tiny shell
Perl で極限に機能を削った shell の作り方を紹介します
Kei Kamikawa
June 23, 2018
Tweet
Share
More Decks by Kei Kamikawa
See All by Kei Kamikawa
Claude Code で Astro blog を Pages から Workers へ移行してみた
codehex
0
260
オレを救った Cline を紹介する
codehex
17
18k
どこでも使える Cloudflare Workers!
codehex
6
940
htmx is fun!
codehex
3
420
すぐ使える Cloudflare Workers!
codehex
15
3.7k
Go to Cloudflare Workers
codehex
8
2.4k
AI Gateway 使っているよ!
codehex
2
2k
日時処理の新スタンダード: Synchro によるタイムゾーン安全、楽々開発
codehex
1
2.6k
Cloudflare Workers は楽しい!
codehex
9
3.4k
Other Decks in Programming
See All in Programming
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
180
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
0
930
ThorVG Viewer In VS Code
nors
0
770
AI巻き込み型コードレビューのススメ
nealle
0
130
Oxlint JS plugins
kazupon
1
800
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
450
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
190
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
150
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
SourceGeneratorのススメ
htkym
0
190
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.8k
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
580
Practical Orchestrator
shlominoach
191
11k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
A Soul's Torment
seathinner
5
2.2k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
320
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Crafting Experiences
bethany
1
47
WCS-LA-2024
lcolladotor
0
450
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
47
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Transcript
1FSMͰ࡞Δ UJOZTIFMM )PLLBJEPQN
!DPEFIFY !$PEF)FY w .FSDBSJ *OD w %FWFMPQJOHNJDSPTFSWJDFT w 0LJOBXBQN w
*MJLF1FSM94(P w IUUQTDPEFIFYIBUFCMPKQ
γΣϧͬͯͬͯ·͔͢
None
/P
$ pwd
$ pwd /Users/codehex
#BTI ;TI pTI
γΣϧʹ ༷ʑͳػೳ͕͋Γ·͢
ྫ͑
ύΠϓ
$ pwd | cat -n
$ pwd | cat -n 1 /Users/codehex
Ξϯυ
$ pwd && echo hello
$ pwd && echo hello /Users/codehex hello
͜ΕΒͷ ࣮Λ͍ͬͯ·͔͢ʁ
ࠓ͢༰
ࠓ͢༰ w ࠷ݶͷγΣϧͷఆٛ w ߏจղੳ w ίϚϯυͷ࣮ߦ
ࠓ͢༰ w ࠷ݶͷγΣϧͷఆٛ w ߏจղੳ w ίϚϯυͷ࣮ߦ
࠷ݶͷγΣϧͷఆٛ UJOZTIFMMͷಈ࡞Λఆٛ͢Δ
lUJOZTIFMMzNFBOT ΊͬͪΌখ͍͞γΣϧ
Ͳ͏͍͏ಈ࡞Λ͢Δ͔
Ͳ͏͍͏ಈ࡞Λ͢Δ͔ w ୯ҰίϚϯυͷ࣮ߦ $ ls w ύΠϓͷ࣮ߦ $ ls
| cat w ΞϯυʹΑΔෳ࣮ߦ $ ls && cat w αϒγΣϧόοΫάϥϯυ࣮ߦࠓճؚΊ·ͤΜ
ࠓ͢༰ w ࠷ݶͷγΣϧͷఆٛ w ߏจղੳ w ίϚϯυͷ࣮ߦ
ߏจղੳ ެจఆٛͱߏจղੳثͷ࡞
$ cat | cat -n && ls
$ cat | cat -n && ls
$ cat | cat -n && ls
$ cat | cat -n && ls
$ cat | cat -n && ls
$ cat | cat -n && ls ࠨ͔Βӈʹղऍ͠·͢
ߏจͷఆٛ
ӈʹ࿈͍݁ͯ͘͠Α͏ʹ ఆ͚ٛΛߦ͏
ߏจఆٛ • CMD: [a-zA-Z_-][0-9a-zA-Z_-]* <ARG> • ARG: [0-9a-zA-Z_-]* <ARG> |
[0-9a-zA-Z_-]* • SHLL: <PIPE> '&&' <AND> | <PIPE> • PIPE: <CMD> '|' <PIPE> | <CMD> • AND: <SHLL> '&&' <AND> | <SHLL>
ߏจղੳثͷ࡞
ߏจղੳثʹඞཁͳཁૉ
ߏจղੳثʹඞཁͳཁૉ w จࣈྻͷεΩϟφʔ w ಡΈࠐΈҐஔಡΈऔͬͨจࣈྻΛอ࣋͢Δ w จࣈྻͷϚονϯά w εΩϟφʔͰಘͨจࣈྻ͕ߏจఆٛʹϚονͨ͠ ͔Ͳ͏͔ผ͢Δ
w Ϛονͨ͠จࣈྻʹҙຯΛͨͤΔ τʔΫϯԽ w ߏจͷੜ
1FSMͰʁ
ਖ਼نදݱ
IUUQTQFSMEPDQFSMPSHQFSMPQIUNMD(@BTTFSUJPO@ l"VTFGVMJEJPNGPSAlexAMJLF TDBOOFSTJTA/\G…/gcAʜz
/\G…/gc
/\G…/gc w A/cANPEJpFSͰݱࡏϚον͍ͯ͠ΔҐஔΛ อ࣋͢Δ͜ͱ͕Ͱ͖Δɻ • pos()ͰҐஔΛऔΓग़͢͜ͱ͕Մೳ • \GͰલճAm//gAͰϚονͨ͠ҐஔΛอ࣋͢Δ͜ͱ ͕Մೳ
εΩϟφʔͱϚονϯάͷ ׂΛͭ͜ͱ͕Ͱ͖Δ ?P? W
͜͜Ͱྑ͍ใ
ΊͬͪΌࢀߟʹͳΔϖʔδ w IUUQTHJUIVCDPNLBSVQBOFSVSBQ +40/CMPCNBTUFSMJC+40/1BSTFSQN w IUUQTHJUIVCDPNLBSVQBOFSVSB50.- 1BSTFSCMPCNBTUFSMJC50.-1BSTFSQN
࣮༷ࢠ
ߏจఆٛ • CMD: [a-zA-Z_-][0-9a-zA-Z_-]* <ARG> • ARG: [0-9a-zA-Z_-]* <ARG> |
[0-9a-zA-Z_-]* • SHLL: <PIPE> '&&' <AND> | <PIPE> • PIPE: <CMD> '|' <PIPE> | <CMD> • AND: <SHLL> '&&' <AND> | <SHLL>
$.%
ߏจఆٛ • CMD: [a-zA-Z_-][0-9a-zA-Z_-]* <ARG> • ARG: [0-9a-zA-Z_-]* <ARG> |
[0-9a-zA-Z_-]* • SHLL: <PIPE> '&&' <AND> | <PIPE> • PIPE: <CMD> '|' <PIPE> | <CMD> • AND: <SHLL> '&&' <AND> | <SHLL>
4)--
ߏจఆٛ • CMD: [a-zA-Z_-][0-9a-zA-Z_-]* <ARG> • ARG: [0-9a-zA-Z_-]* <ARG> |
[0-9a-zA-Z_-]* • SHLL: <PIPE> '&&' <AND> | <PIPE> • PIPE: <CMD> '|' <PIPE> | <CMD> • AND: <SHLL> '&&' <AND> | <SHLL>
1*1&
ߏจఆٛ • CMD: [a-zA-Z_-][0-9a-zA-Z_-]* <ARG> • ARG: [0-9a-zA-Z_-]* <ARG> |
[0-9a-zA-Z_-]* • SHLL: <PIPE> '&&' <AND> | <PIPE> • PIPE: <CMD> '|' <PIPE> | <CMD> • AND: <SHLL> '&&' <AND> | <SHLL>
"/%
ΛQSJOU༷ͨ͠ࢠ $ cat | cat -n && ls
"/% 1*1& DBU DBU MT $ cat | cat -n
&& ls
ͪͳΈʹ
$ cat | cat -n && ls
$ cat | cat -n && ls ࠨ͔Βӈʹղऍ͠·͢
ͳͷͰ ΛḷΔͱ͖
"/% 1*1& DBU DBU MT $ cat | cat -n
&& ls ᶃ
"/% 1*1& DBU DBU MT $ cat | cat -n
&& ls ᶃ ᶄ ᶅ
"/% 1*1& DBU DBU MT $ cat | cat -n
&& ls ᶃ ᶄ ᶅ ᶆ ᶇ
͜ΕΛجʹ ࣮ߦ͢ΔػೳΛ࡞͠·͢
ࠓ͢༰ w ࠷ݶͷγΣϧͷఆٛ w ߏจղੳ w ίϚϯυͷ࣮ߦ
ίϚϯυͷ࣮ߦ ߏจΛجʹ࣮ߦ͢Δ
࣮ͷલʹ
ඪ४ετϦʔϜʹ͍ͭͯ
w 45%*/ 4UBOEBSE*OQVU ඪ४ೖྗ w 45%065 4UBOEBSE0VUQVU ඪ४ग़ྗ w 45%&33
4UBOEBSE&SSPS ඪ४Τϥʔग़ྗ ඪ४ετϦʔϜ
͜ΕΒ࣮࣭ ϑΝΠϧͱͯ͠ѻΘΕ·͢
୯ҰίϚϯυͷ ετϦʔϜͷϑϩʔ
$ cat
$ cat cat 45%*/
$ cat cat 45%*/ 45%065 45%&33
$ cat GPSLΛ͏ͱTIΛհ͞ͳ͍Ͱ࣮ߦՄೳ
ύΠϓͷϑϩʔ
$ fortune | cowsay
$ fortune | cowsay 45%*/ PS/PU ᶃ
$ fortune | cowsay 45%*/ PS/PU 45%065 ᶃ ᶄ
$ fortune | cowsay 45%*/ PS/PU 45%065 45%*/ ᶃ ᶄ
ᶅ
$ fortune | cowsay 45%*/ PS/PU 45%065 45%*/ 45%065 ᶃ
ᶄ ᶅ ᶆ
͜ΕΒͷίϚϯυ ผϓϩηεͰಈ͍͍ͯ·͢
$ ps a | cat 1*%
ύΠϓͷ࣮
pipe my ($r, $w);
w $r͕3FBEFS $w͕8SJUFS w 8SJUFSʹσʔλ͕ॻ͖ࠐ·Εͨͱ͖ 3FBEFSͰͦͷσʔλΛಡΈऔΔ͜ͱ͕Մೳ pipe my ($r, $w);
֤ϓϩηεؒͷετϦʔϜΛ pipe()Ͱܨ͛Δ͜ͱͰ࣮Մೳ
ͦͷ࣌ͷϑϩʔ
$ fortune | cowsay 45%*/ PS/PU 45%065 ᶃ ᶄ
$ fortune | cowsay 45%*/ PS/PU 45%065 ᶃ ᶄ ᶅ
ᶆ 8SJUFS 3FBEFS
$ fortune | cowsay 45%*/ PS/PU 45%065 45%*/ 45%065 ᶃ
ᶄ ᶅ ᶆ 8SJUFS 3FBEFS ᶇ ᶈ ᶉ
ͳͷͰ࣮࣭ ͜ͷΑ͏ʹߟ͑ΒΕΔ
$ fortune | cowsay 45%*/ PS/PU 8SJUFS 3FBEFS 45%065 ᶃ
ᶄ ᶅ ᶆ
None
w ίϚϯυOPEFͰ͔ͭOPEF͕ύΠϓͰͳ͍ ߹ଈίϚϯυΛ࣮ߦ w ͦΕҎ֎ίϚϯυΛอ࣋͢Δ w ύΠϓOPEF͔͕ͭύΠϓOPEFͰͳ͍߹ อ࣋͠ଓ͚ͨίϚϯυΛ࣮ߦ
Ξϯυͷϑϩʔ
$ echo hello && echo world
$ echo hello && echo world ᶃ
$ echo hello && echo world ᶃ ᶄ
w ΞϯυOPEFʹདྷΔ·ͰʹࠨͷOPEFΛ શ࣮ͯߦ͢Δ w ޭͨ͠߹ӈͷOPEFΛࠨͷOPEFͱಉ͡Α͏ ʹ࣮ߦ͢Δ
͜Ε͚ͩͰ UJOZTIFMM͕͠·͢ʂ
·ͱΊ
·ͱΊ w ӈʹ࿈͍݁ͯ͘͠Α͏ʹߏจఆٛͨ͠ w γΣϧͷύΠϓɺΞϯυػೳΛཧղͯ͠ɺղੳ࣌ʹ ࣮ߦ͢ΔػೳΛ࡞ͨ͠
࣭Ͳ͏ͧ https://github.com/Code-Hex/p5-Shell-Tiny