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
530
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
380
RubyKaigi で LT 初登壇したきっかけと感想
fohte
1
950
Datadog Logs を活用して SLO 監視基盤を構築する
fohte
3
1.3k
The Journey of rubocop-daemon into RuboCop
fohte
1
1.1k
rubocop-daemon 裏話: OSS の苦悩
fohte
2
600
RuboCop Server Mode の仕組み
fohte
1
290
Ruby を使ったプロダクト開発を支えるオブザーバビリティ基盤
fohte
2
150
インシデントコマンダーやってみた
fohte
5
1k
Ruby でもなんとかなる - ISUCON13 公式反省会
fohte
0
160
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
230
52k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.5k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
BBQ
matthewcrist
85
9.4k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
GraphQLとの向き合い方2022年版
quramy
44
13k
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