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.5k
Perl で作る tiny shell
Perl で極限に機能を削った shell の作り方を紹介します
Kei Kamikawa
June 23, 2018
Tweet
Share
More Decks by Kei Kamikawa
See All by Kei Kamikawa
htmx is fun!
codehex
2
230
すぐ使える Cloudflare Workers!
codehex
13
2.9k
Go to Cloudflare Workers
codehex
8
1.6k
AI Gateway 使っているよ!
codehex
2
1.2k
日時処理の新スタンダード: Synchro によるタイムゾーン安全、楽々開発
codehex
1
1.4k
Cloudflare Workers は楽しい!
codehex
9
2.9k
gRPC Client on Cloudflare Workers
codehex
2
4.9k
NOT A HOTEL AI コンシェルジュ「Kevin」とキャッシュ
codehex
1
1.4k
NOT A HOTEL AIコンシェルジュ「Kevin」の開発秘話
codehex
8
120k
Other Decks in Programming
See All in Programming
JavaScript Closure
asoluka
0
1.9k
Kotlin Multiplatform at Stable and Beyond (Android Makers 2024)
zsmb
0
600
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
2
460
Balkan Ruby 2024 — How and why to run SQLite on Rails in production
fractaledmind
0
110
Powerfully Typed TypeScript
euxn23
3
850
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
170
仕様と実装で学ぶOpenTelemetry
drumato
2
190
株式会社ゼネテック
genetec
0
120
ServerAction で Progressive Enhancement はどこまで頑張れるか? / progressive-enhancement-with-server-action
takefumiyoshii
6
500
RustでAWS Lambda functionをいい感じに書く
taiki45
2
140
ペパボOpenTelemetry革命
pyama86
2
220
Next.js App Router
quramy
14
2.3k
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
345
19k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
67
14k
Visualization
eitanlees
137
14k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
104
6.7k
The Mythical Team-Month
searls
217
42k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
Producing Creativity
orderedlist
PRO
338
39k
A Modern Web Designer's Workflow
chriscoyier
689
190k
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