Rubyの-cオプションを使うと、スクリプトを実行せずに構文だけをチェックできる。

基本的な使い方

ruby -cにファイルを指定すると、構文が正しければSyntax OKと表示される。

$ cat ok.rb
def hello
  puts "Hello, World!"
end

$ ruby -c ok.rb
Syntax OK

構文エラーがある場合はエラー内容が表示され、終了ステータスも1になる。

$ cat ng.rb
def hello
  puts "Hello, World!"

$ ruby -c ng.rb
ruby: ng.rb:2: syntax errors found (SyntaxError)
> 1 | def hello
    | ^~~ expected an `end` to close the `def` statement
> 2 |   puts "Hello, World!"
    |                       ^ unexpected end-of-input, assuming it is closing the parent top level context

$ echo $?
1

終了ステータスで判定できるため、CIやGit hookで構文チェックを組み込むのに使いやすい。

標準入力からチェックする

ファイルを指定しない場合は標準入力を読み込んでチェックする。

$ echo 'puts "hi"' | ruby -c
Syntax OK

複数ファイルは一括チェックできない

ruby -cに複数のファイルを渡しても、チェックされるのは先頭のファイルのみである。

$ ruby -c ok.rb ng.rb
Syntax OK

上記の例ではng.rbは構文エラーを含むが、ok.rbのみがチェックされてSyntax OKと表示される。2番目以降の引数はチェック対象ではなく、スクリプトに渡すARGVとして扱われるためである。

ディレクトリ配下の.rbファイルをまとめてチェックしたい場合は、findxargsを組み合わせて1ファイルずつruby -cを実行する。

$ find . -name "*.rb" | xargs -n1 ruby -c
Syntax OK
ruby: ./ng.rb:2: syntax errors found (SyntaxError)
> 1 | def hello
    | ^~~ expected an `end` to close the `def` statement
> 2 |   puts "Hello, World!"
    |                       ^ unexpected end-of-input, assuming it is closing the parent top level context

構文エラーだけでなく未使用変数などの警告も確認したい場合は【Ruby】-w/-Wオプションで警告を表示する を参照。