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
どこでも使える Cloudflare Workers!
codehex
6
730
htmx is fun!
codehex
2
340
すぐ使える Cloudflare Workers!
codehex
15
3.3k
Go to Cloudflare Workers
codehex
8
2.1k
AI Gateway 使っているよ!
codehex
2
1.5k
日時処理の新スタンダード: Synchro によるタイムゾーン安全、楽々開発
codehex
1
2.2k
Cloudflare Workers は楽しい!
codehex
9
3.3k
gRPC Client on Cloudflare Workers
codehex
2
5.9k
NOT A HOTEL AI コンシェルジュ「Kevin」とキャッシュ
codehex
1
1.7k
Other Decks in Programming
See All in Programming
推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた
nobu09
2
310
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
230
はじめての Go * WASM *OCR
sgash708
1
100
Visual StudioのGitHub Copilotでいろいろやってみる
tomokusaba
1
210
dbt Pythonモデルで実現するSnowflake活用術
trsnium
0
260
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
230
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
8
2.4k
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
150
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
5
1.3k
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
840
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
920
PHPカンファレンス名古屋2025 タスク分解の試行錯誤〜レビュー負荷を下げるために〜
soichi
1
680
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
RailsConf 2023
tenderlove
29
1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Music & Morning Musume
bryan
46
6.4k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
380
Typedesign – Prime Four
hannesfritz
40
2.5k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
How to train your dragon (web standard)
notwaldorf
91
5.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
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