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
Ruby as Shell script
Search
Hayato Kawai
April 24, 2024
2
690
Ruby as Shell script
「Gotanda.rb#58」で発表した LT スライドです。
https://gotanda-rb.connpass.com/event/315058/
Hayato Kawai
April 24, 2024
Tweet
Share
More Decks by Hayato Kawai
See All by Hayato Kawai
Bedrock のコスト監視設計
fohte
2
470
Data Access Control で実現するより細かい権限制御
fohte
0
310
Datadog が支える Wantedly のシステム運用
fohte
0
100
Devin や Cursor などの生成 AI ツール導入に向けて何を取り組んだのか
fohte
2
330
Datadog Network Monitoring を活用して NAT Gateway 課金を 80 % 削減した話
fohte
2
760
Trace Metrics と Istio Metrics でサービス健全性を監視する
fohte
0
530
段階的リリースを実現する kube canary
fohte
1
230
巨大 tfstate に立ち向かう技術
fohte
1
1.2k
RubyKaigi で LT 初登壇したきっかけと感想
fohte
1
1.4k
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
450
A better future with KSS
kneath
240
18k
Agile that works and the tools we love
rasmusluckow
331
21k
Making Projects Easy
brettharned
120
6.6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
The Curious Case for Waylosing
cassininazir
0
230
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Transcript
Ruby as Shell script Gotanda.rb#58 2024-04-24 - Hayato Kawai (@fohte)
あなた誰 名前: @fohte (ふぉーて) 川井 颯人 (Hayato Kawai) 所属: ウォンテッドリー株式会社
趣味: 🎮 🎹
シェルスクリプト 書いてますか?
シェルスクリプト つらい
シェルスクリプトはつらい • nc コマンドが OS によって 若干違う ◦ 条件分岐の嵐 https://speakerdeck.com/fohte/
rubocop-daemon-li-hua-oss-noku-nao
Ruby で書こう
シェルスクリプトを書きたくなる場面 • 一度しか使わないが、やや複雑な処理 ◦ e.g. 何かを集計するバッチ • 日常的なタスクの自動化 ◦ e.g.
Git hooks、リポジトリ固有の処理 (初期セットアップなど)
シェルスクリプト (bash) はここがつらい • コマンドに環境差異がある ◦ よくある例: sed コマンドは macOS
でも BSD 版/GNU 版で動作が異なる ▪ デフォルトでは BSD 版、gnu-sed を入れていると GNU 版
シェルスクリプト (bash) はここがつらい • syntax が難しい ◦ if [ -n
"${1:-}"]; then … ▪ -n 🤔 • !$1.empty? と同じ ▪ ${1:-} 🤔 🤔 • defined?($1) ? $1 : '' と同じ
シェルスクリプト (bash) はここがつらい • ハマりどころが多い ◦ よくある例: 途中でコマンドが失敗しても処理が続行される ▪ set
-eo pipefail しよう、みたいなお作法はあるが、知らないとハマる ◦ 未定義変数を参照してもエラーにならない ▪ set -u すれば解決するが、 …
Ruby で書けば解決! • コマンドに環境差異がある => Ruby のメソッドや標準ライブラリを使おう • syntax が難しい
=> Ruby は平易 (ですよね?) • ハマりどころが多い => Ruby なら慣れてる (人も多いと思いたい)
Ruby で簡単なスクリプトを書くときのお作法 お作法はたった 2 つ • shebang (#!/usr/bin/env ruby) を書こう
• bundler/inline を使おう
shebang (#!/usr/bin/env ruby) を書こう • #!/usr/bin/env ruby をファイルの 1 行目に書く
◦ 簡単にいうと「Ruby で実行する」という定義になる ▪ #!/bin/bash なら Bash、#!/usr/bin/env python なら Python
shebang の何が嬉しいのか • ruby script.rb みたいに書かなくても ./script だけで実行できるようになる ◦ (script
というファイル名 & ファイルに実行権限がある前提 ) ◦ 実行する人にとって、「そのスクリプトが何で実装されているのか」を 意識しなくて良くなる • Git hooks も Ruby で実装できる ◦ 例えば pre-commit は .git/hooks/pre-commit というパス ◦ Ruby で書いて shebang 書いてこのパスに置けば良い
bundler/inline を使おう • よくあるケース: Ruby スクリプトの中からも gem を使いたい! ◦ 例:
Faraday 使いたいな… • そんなときに便利なのが bundler/inline
gem 使いたいときに簡単なのは gem install • 一番簡単なのは gem install すること ◦
gem install ではシステム全体に gem をインストールする ◦ require で読み込めるようになる • ただし他の環境で実行できなくなる ◦ 実行前に gem install しておく必要がある
そこで bundler/inline が便利 • bundler/inline を使えば解決!
bundler/inline の便利なところ • 実行時に bundle install される ◦ Gemfile 不要
◦ gem がなければインストールされるし、あればされない ◦ 実行時に gem があることが保証される ▪ gem install しておく必要がなくなる • 記法は Gemfile と同じ
余談: コマンドライン引数を定義したい ! optparse が便利 (標準ライブラリ) https://docs.ruby-lang.org/ja/latest/library/optparse.html