$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
もしも、社内標準言語がBASHに統一されたら
Search
Kentaro Hayashi
August 10, 2020
Programming
1
51
もしも、社内標準言語がBASHに統一されたら
https://moshi-bash-slide.netlify.app/
Kentaro Hayashi
August 10, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
430
dotfiles 式年遷宮 令和最新版
masawada
1
790
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.2k
AIエージェントの設計で注意するべきポイント6選
har1101
4
310
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
120
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
210
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
520
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
130
Github Copilotのチャット履歴ビューワーを作りました~WPF、dotnet10もあるよ~ #clrh111
katsuyuzu
0
110
認証・認可の基本を学ぼう後編
kouyuume
0
240
GISエンジニアから見たLINKSデータ
nokonoko1203
0
150
Graviton と Nitro と私
maroon1st
0
110
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.5k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
GraphQLとの向き合い方2022年版
quramy
50
14k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
We Have a Design System, Now What?
morganepeng
54
7.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Balancing Empowerment & Direction
lara
5
800
The Language of Interfaces
destraynor
162
25k
Done Done
chrislema
186
16k
The World Runs on Bad Software
bkeepers
PRO
72
12k
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/
ようやく写真を表⽰することができました
結び
サーバ書くと勉強になる 意外と楽しい 今度はもっと低いレイヤーからチャレンジし ても良いかも
完