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
500
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
巨大 tfstate に立ち向かう技術
fohte
1
340
RubyKaigi で LT 初登壇したきっかけと感想
fohte
1
900
Datadog Logs を活用して SLO 監視基盤を構築する
fohte
3
920
The Journey of rubocop-daemon into RuboCop
fohte
1
1.1k
rubocop-daemon 裏話: OSS の苦悩
fohte
2
580
RuboCop Server Mode の仕組み
fohte
1
280
Ruby を使ったプロダクト開発を支えるオブザーバビリティ基盤
fohte
2
140
インシデントコマンダーやってみた
fohte
5
1k
Ruby でもなんとかなる - ISUCON13 公式反省会
fohte
0
150
Featured
See All Featured
Producing Creativity
orderedlist
PRO
341
39k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
It's Worth the Effort
3n
183
28k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
84
Unsuck your backbone
ammeep
669
57k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
270
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Agile that works and the tools we love
rasmusluckow
328
21k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
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