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
もしも、社内標準言語がBASHに統一されたら
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kentaro Hayashi
August 10, 2020
Programming
53
1
Share
もしも、社内標準言語がBASHに統一されたら
https://moshi-bash-slide.netlify.app/
Kentaro Hayashi
August 10, 2020
Other Decks in Programming
See All in Programming
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
4
870
Nuxt Server Components
wattanx
0
270
Swift Concurrency Type System
inamiy
0
480
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
500
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
240
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
300
AI時代のPhpStorm最新事情 #phpcon_odawara
yusuke
0
160
How Swift's Type System Guides AI Agents
koher
0
230
PDI: Como Alavancar Sua Carreira e Seu Negócio
marcelgsantos
0
120
3分でわかるatama plusのQA/about atama plus QA
atamaplus
0
150
Feature Toggle は捨てやすく使おう
gennei
0
570
KagglerがMixSeekを触ってみた
morim
0
370
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
350
Context Engineering - Making Every Token Count
addyosmani
9
820
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
260
Thoughts on Productivity
jonyablonski
76
5.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
320
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
880
Being A Developer After 40
akosma
91
590k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
54k
The Pragmatic Product Professional
lauravandoore
37
7.2k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.6k
Transcript
もしも、社内標準⾔ 語が BASH に統⼀さ れたら
はじめに
Bash でいいものを作ったので⾃慢しに来まし た 将来なにかの間違いで社内標準⾔語がBash に 統⼀されたら⼤変ですよね。その時になって 慌てないよう、Bash ⼒を鍛えておきましょ う。
BASH とは Bourne Shell のフリーソフトウェアによる代替 版。Bourne-again shell の頭⽂字 1989 年⽣まれ
ヒストリ機能や補完機能を持っている 近年のLinux 等で標準のシェルとして使われて いる。 sh に⽐べたらナウい
きっかけは NETCAT netcat と組み合わせればワンライナーでサーバを⽴ てることができる。 コマンドを叩けば、標準⼊出⼒が socket と繋がる。 while true;
\ do { echo -e 'HTTP/1.1 200 OK\r\n'; cat test.sh; } |\ nc -l 8080; done
ものたりない
もっと複雑な事がしたい
netcat をそのまま使っても、リクエストを解析して レスポンスを返すみたいなことができない。この ままだと複雑なことができなくて悲しい。 ⼀部の安全でないnetcat では オプション という ものがあるらしい。これを使えばbash に処理を⼀
任できそう。
しかしデフォルトで⼊っているnc コマンドには がなかった・・・。
GNU NETCAT ならいけそう
⼊れてみる これを使えば、bash だけでWeb サーバ作れるんじゃ ね? bash 縛りとか楽しそう。 $ brew install
netcat # GNU netcat $ netcat -lp 8080 -e /bin/bash hoge.sh # 良 $ netcat -lp 8080 -e /bin/bash
BASH 縛り WEB サーバの構想 どこまで厳密な意味でbash 縛りとする か・・・ ビルトインコマンド限定? cat やsed
はあり? awk はあり? listen するためにnetcat 使うのずるくない?
検証
BASH だけで LISTEN できるのか? にアクセスす れば、こちらからコネクションを張ることは できるらしい bash でTCP 通信
でもlisten はできない
結論(縛りプレイのルール)
ルール 1 bash はシステムにデフォルトで⼊っているバージ ョンを使⽤する
ルール 2 標準で使えるコマンドはだいたい使⽤可能 ↑ ただ し、「プログラミング⾔語」に属するものはNG (awk やperl はNG )
ルール 3 TCP でlisten するために他のシンプルなコマンド (nc など)に頼るのはOK (でもhttpd とかはズルい のでダメ)
ルール 4 bash で書かれたライブラリは使ってもOK (結局テ ンプレートエンジンしか使わなかったけど)
更に⼟⽇の頑張りを経て
良いものができました https://github.com/kentaro-hayashi/bashweb
実演
実装してみて感じた細かいこと
bash はweb に向いていない 世間のフレームワークの素晴らしさを知った Controller とView とRouting の実装までして疲れ たので、model(ORM) は⼿を付けなかった
【⾟み】bash の関数は値を返せない 返せるんだけど終了コードのみ これは関数というよりサブルーチン 参照渡しはできなくない 関数を別の変数に代⼊するのはできる☺
【⾟み】bash のバージョンが古いので連想配 列がない 連想配列がないので⿊魔術のような記法 に・・・ 【⾟み】関数のスコープはグローバルスコー プ 【⾟み】上位スコープでreadonly として宣⾔さ れた変数名は下位のローカルスコープで再定
義できない
【⾟み】PASH を間違えて書き換えてハマった 【⾟み】read コマンドは改⾏を待ち受けるの で、改⾏で終わらないリクエストのときは待 ちぼうける 【⾟み】配列の扱い(意外とファイルを1 ⾏ず つ配列に⼊れるのは⾯倒くさい)
変数展開機能、知らなかった 【⾟み】サブシェルが起動してしまうと変数 を定義しても無駄になるので注意(しかも発 動条件がわかりにくい) シェルの変数展開 bash で,サブシェルが起動される条件
連続したリクエストを受信する と CONNECTION がはれない問題
静的な画像ファイルの配信にも対応させて、ウキ ウキしながらHTML 中にimg タグを書いた。
しかし、画像が表⽰されない。
画像取得時にTCP Connection がはれていないのが原 因でした。
netcat を使った既存の仕組みはこう。
これだと、なにかのリクエストを処理している間 は他のリクエストに返事ができない。 (accept できないのでガン無視状態)
よくあるサーバプロセスなどはこんな感じだと思 うけれど、netcat はそういうふうにできていない。
NETCAT から TCPSERVER に乗り 換えました
tcpserver (D.J.Bernstein )ならちゃんとaccept 後に fork してくれる。 http://cr.yp.to/
ようやく写真を表⽰することができました
結び
サーバ書くと勉強になる 意外と楽しい 今度はもっと低いレイヤーからチャレンジし ても良いかも
完