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
1
580
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
Trace Metrics と Istio Metrics でサービス健全性を監視する
fohte
0
350
段階的リリースを実現する kube canary
fohte
1
150
巨大 tfstate に立ち向かう技術
fohte
1
440
RubyKaigi で LT 初登壇したきっかけと感想
fohte
1
1.1k
Datadog Logs を活用して SLO 監視基盤を構築する
fohte
3
1.8k
The Journey of rubocop-daemon into RuboCop
fohte
1
1.3k
rubocop-daemon 裏話: OSS の苦悩
fohte
2
650
RuboCop Server Mode の仕組み
fohte
1
330
Ruby を使ったプロダクト開発を支えるオブザーバビリティ基盤
fohte
2
180
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.4k
Side Projects
sachag
453
42k
Bash Introduction
62gerente
612
210k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Adopting Sorbet at Scale
ufuk
76
9.3k
Thoughts on Productivity
jonyablonski
69
4.6k
YesSQL, Process and Tooling at Scale
rocio
172
14k
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