Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby as Shell script

Hayato Kawai
April 24, 2024
500

Ruby as Shell script

「Gotanda.rb#58」で発表した LT スライドです。
https://gotanda-rb.connpass.com/event/315058/

Hayato Kawai

April 24, 2024
Tweet

Transcript

  1. シェルスクリプト (bash) はここがつらい • コマンドに環境差異がある ◦ よくある例: sed コマンドは macOS

    でも BSD 版/GNU 版で動作が異なる ▪ デフォルトでは BSD 版、gnu-sed を入れていると GNU 版
  2. シェルスクリプト (bash) はここがつらい • syntax が難しい ◦ if [ -n

    "${1:-}"]; then … ▪ -n 🤔 • !$1.empty? と同じ ▪ ${1:-} 🤔 🤔 • defined?($1) ? $1 : '' と同じ
  3. シェルスクリプト (bash) はここがつらい • ハマりどころが多い ◦ よくある例: 途中でコマンドが失敗しても処理が続行される ▪ set

    -eo pipefail しよう、みたいなお作法はあるが、知らないとハマる ◦ 未定義変数を参照してもエラーにならない ▪ set -u すれば解決するが、 …
  4. Ruby で書けば解決! • コマンドに環境差異がある => Ruby のメソッドや標準ライブラリを使おう • syntax が難しい

    => Ruby は平易 (ですよね?) • ハマりどころが多い => Ruby なら慣れてる (人も多いと思いたい)
  5. shebang (#!/usr/bin/env ruby) を書こう • #!/usr/bin/env ruby をファイルの 1 行目に書く

    ◦ 簡単にいうと「Ruby で実行する」という定義になる ▪ #!/bin/bash なら Bash、#!/usr/bin/env python なら Python
  6. shebang の何が嬉しいのか • ruby script.rb みたいに書かなくても ./script だけで実行できるようになる ◦ (script

    というファイル名 & ファイルに実行権限がある前提 ) ◦ 実行する人にとって、「そのスクリプトが何で実装されているのか」を 意識しなくて良くなる • Git hooks も Ruby で実装できる ◦ 例えば pre-commit は .git/hooks/pre-commit というパス ◦ Ruby で書いて shebang 書いてこのパスに置けば良い
  7. bundler/inline を使おう • よくあるケース: Ruby スクリプトの中からも gem を使いたい! ◦ 例:

    Faraday 使いたいな… • そんなときに便利なのが bundler/inline
  8. gem 使いたいときに簡単なのは gem install • 一番簡単なのは gem install すること ◦

    gem install ではシステム全体に gem をインストールする ◦ require で読み込めるようになる • ただし他の環境で実行できなくなる ◦ 実行前に gem install しておく必要がある
  9. bundler/inline の便利なところ • 実行時に bundle install される ◦ Gemfile 不要

    ◦ gem がなければインストールされるし、あればされない ◦ 実行時に gem があることが保証される ▪ gem install しておく必要がなくなる • 記法は Gemfile と同じ