Perl で極限に機能を削った shell の作り方を紹介します
1FSMͰ࡞Δ UJOZTIFMM)PLLBJEPQN
View Slide
!DPEFIFY !$PEF)FYw .FSDBSJ *ODw %FWFMPQJOHNJDSPTFSWJDFTw 0LJOBXBQNw *MJLF1FSM94(Pw IUUQTDPEFIFYIBUFCMPKQ
γΣϧͬͯͬͯ·͔͢
/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 ίϚϯυͷ࣮ߦ
࠷ݶͷγΣϧͷఆٛUJOZTIFMMͷಈ࡞Λఆٛ͢Δ
lUJOZTIFMMzNFBOT ΊͬͪΌখ͍͞γΣϧ
Ͳ͏͍͏ಈ࡞Λ͢Δ͔
Ͳ͏͍͏ಈ࡞Λ͢Δ͔w ୯ҰίϚϯυͷ࣮ߦ $ lsw ύΠϓͷ࣮ߦ $ ls | cat w ΞϯυʹΑΔෳ࣮ߦ $ ls && cat w αϒγΣϧόοΫάϥϯυ࣮ߦࠓճؚΊ·ͤΜ
ߏจղੳެจఆٛͱߏจղੳثͷ࡞
$ cat | cat -n && ls
$ cat | cat -n && lsࠨ͔Βӈʹղऍ͠·͢
ߏจͷఆٛ
ӈʹ࿈͍݁ͯ͘͠Α͏ʹ ఆ͚ٛΛߦ͏
ߏจఆٛ• CMD: [a-zA-Z_-][0-9a-zA-Z_-]* • ARG: [0-9a-zA-Z_-]* | [0-9a-zA-Z_-]*• SHLL: '&&' | • PIPE: '|' | • AND: '&&' |
ߏจղੳثͷ࡞
ߏจղੳثʹඞཁͳཁૉ
ߏจղੳثʹඞཁͳཁૉw จࣈྻͷεΩϟφʔw ಡΈࠐΈҐஔಡΈऔͬͨจࣈྻΛอ࣋͢Δw จࣈྻͷϚονϯάw εΩϟφʔͰಘͨจࣈྻ͕ߏจఆٛʹϚον͔ͨ͠Ͳ͏͔ผ͢Δw Ϛονͨ͠จࣈྻʹҙຯΛͨͤΔ τʔΫϯԽw ߏจͷੜ
1FSMͰʁ
ਖ਼نදݱ
IUUQTQFSMEPDQFSMPSHQFSMPQIUNMD(@BTTFSUJPO@l"VTFGVMJEJPNGPSAlexAMJLF TDBOOFSTJTA/\G…/gcAʜz
/\G…/gc
/\G…/gcw A/cANPEJpFSͰݱࡏϚον͍ͯ͠ΔҐஔΛ อ࣋͢Δ͜ͱ͕Ͱ͖Δɻ• pos()ͰҐஔΛऔΓग़͢͜ͱ͕Մೳ• \GͰલճAm//gAͰϚονͨ͠ҐஔΛอ࣋͢Δ͜ͱ͕Մೳ
εΩϟφʔͱϚονϯάͷ ׂΛͭ͜ͱ͕Ͱ͖Δ ?P?W
͜͜Ͱྑ͍ใ
ΊͬͪΌࢀߟʹͳΔϖʔδw IUUQTHJUIVCDPNLBSVQBOFSVSBQ+40/CMPCNBTUFSMJC+40/1BSTFSQNw IUUQTHJUIVCDPNLBSVQBOFSVSB50.-1BSTFSCMPCNBTUFSMJC50.-1BSTFSQN
࣮༷ࢠ
$.%
4)--
1*1&
"/%
ΛQSJOU༷ͨ͠ࢠ$ cat | cat -n && ls
"/%1*1&DBUDBUMT$ cat | cat -n && ls
ͪͳΈʹ
ͳͷͰ ΛḷΔͱ͖
"/%1*1&DBUDBUMT$ cat | cat -n && lsᶃ
"/%1*1&DBUDBUMT$ cat | cat -n && lsᶃ ᶄᶅ
"/%1*1&DBUDBUMT$ cat | cat -n && lsᶃ ᶄᶅᶆ ᶇ
͜ΕΛجʹ ࣮ߦ͢ΔػೳΛ࡞͠·͢
ίϚϯυͷ࣮ߦߏจΛجʹ࣮ߦ͢Δ
࣮ͷલʹ
ඪ४ετϦʔϜʹ͍ͭͯ
w 45%*/ 4UBOEBSE*OQVUඪ४ೖྗw 45%065 4UBOEBSE0VUQVUඪ४ग़ྗw 45%&33 4UBOEBSE&SSPSඪ४Τϥʔग़ྗඪ४ετϦʔϜ
͜ΕΒ࣮࣭ ϑΝΠϧͱͯ͠ѻΘΕ·͢
୯ҰίϚϯυͷ ετϦʔϜͷϑϩʔ
$ cat
$ catcat45%*/
$ catcat45%*/45%06545%&33
$ catGPSLΛ͏ͱTIΛհ͞ͳ͍Ͱ࣮ߦՄೳ
ύΠϓͷϑϩʔ
$ fortune | cowsay
$ fortune | cowsay45%*/PS/PUᶃ
$ fortune | cowsay45%*/PS/PU45%065ᶃ ᶄ
$ fortune | cowsay45%*/PS/PU45%065 45%*/ᶃ ᶄ ᶅ
$ fortune | cowsay45%*/PS/PU45%065 45%*/ 45%065ᶃ ᶄ ᶅ ᶆ
͜ΕΒͷίϚϯυ ผϓϩηεͰಈ͍͍ͯ·͢
$ ps a | cat1*%
ύΠϓͷ࣮
pipe my ($r, $w);
w $r͕3FBEFS $w͕8SJUFSw 8SJUFSʹσʔλ͕ॻ͖ࠐ·Εͨͱ͖ 3FBEFSͰͦͷσʔλΛಡΈऔΔ͜ͱ͕Մೳpipe my ($r, $w);
֤ϓϩηεؒͷετϦʔϜΛ pipe()Ͱܨ͛Δ͜ͱͰ࣮Մೳ
ͦͷ࣌ͷϑϩʔ
$ fortune | cowsay45%*/PS/PU45%065ᶃ ᶄ ᶅ ᶆ8SJUFS3FBEFS
$ fortune | cowsay45%*/PS/PU45%065 45%*/ 45%065ᶃ ᶄ ᶅ ᶆ8SJUFS3FBEFSᶇᶈ ᶉ
ͳͷͰ࣮࣭ ͜ͷΑ͏ʹߟ͑ΒΕΔ
$ fortune | cowsay45%*/PS/PU8SJUFS 3FBEFS 45%065ᶃ ᶄ ᶅ ᶆ
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