🤖

Claude Codeが勝手に`/dev/null`を挿入することでRails runnerコマンドが失敗する問題と回避方法

に公開

問題

Claude CodeがRails runnerコマンドを実行する際、以下のようなエラーが発生します。

コマンド

docker-compose exec -T web rails r - <<EOF
  [1,2,3].each { |n| puts n }
EOF

エラー

/usr/local/bundle/gems/railties-7.0.4/lib/rails/commands/runner/runner_command.rb:73: syntax error, unexpected '<'
       .each do  < /dev/null | arg |

GitHubのIssueにもなっていました。
https://github.com/anthropics/claude-code/issues/2859

原因

Claude Codeはコマンドを実行するとき、最初に出現するパイプ文字に直前に

< /dev/null

を挿入するようになっています。パイプでつながれた最初のコマンドが標準入力を読み取る場合、入力待ちになるのを防ぐために、標準入力を機械的に空にするためだと思われます。

解決策

おとりのパイプを記述します。コマンドの先頭に:|: ;を追加して、そこに< /dev/nullが挿入されるように仕向けます😈

:|: ; docker compose exec -T web rails r - <<EOF
  [1,2,3].each { |n| puts n }
EOF

:|: ;の説明

  • : - 何もしないコマンド(no-op)
  • | - パイプ
  • : - 再度何もしないコマンド
  • ; - コマンドの区切り

Claude Codeに伝える

最後に、Claude Codeに、docker composeコマンドを使うときは毎回先頭に:|: ;を付けることを伝えておきます。

CLAUDE.md に以下を追加します。

---
description: DBのデータを参照する際の推奨コマンド
globs:
alwaysApply: false
---
# DBのデータを参照する際の推奨コマンド

## 概要
データベースのデータを参照する際は、以下のコマンドを使用することを推奨します。このコマンドを使用することで、確実にRails Consoleを起動でき、シェルでの文字列解釈によるエラーが発生しにくくなります。

## 重要:Claude Code使用時の注意事項

Claude Codeは最初のパイプ(`|`)の前に自動的に`< /dev/null`を挿入する仕様があります。そのため、Rubyコード内にブロックパラメータ(例:`|n|`)が含まれる場合、シンタックスエラーが発生します。

### エラーの例
\```bash
# これはエラーになります
docker compose exec -T web rails r - <<EOF
  [1,2,3].each { |n| puts n }  # < /dev/null が |n| の前に挿入されてエラー
EOF
\```

### 解決方法
コマンドの先頭に`:|: ;`を追加することで、この問題を回避できます。`:|: ;`は以下の構成になっています:
- `:` - 何もしないコマンド(no-op)
- `|` - パイプ
- `:` - 再度何もしないコマンド
- `;` - コマンドの区切り

これにより、`< /dev/null`が最初の`:`と`|`の間に挿入されても、Rubyコードには影響しません。

## 推奨コマンド
\```bash
:|: ; docker compose exec -T web rails r - <<EOF
  # ここにRailsコンソールのコードを記述
EOF
\```

### オプションの説明
- `-T`: 擬似TTYを無効化(より安定した動作のため)
- `-`: 標準入力からRubyコードを読み込む

## 使用例
\```bash
:|: ; docker compose exec -T web rails r - <<EOF
  [1,2,3].each { |n| puts n }
EOF
\```

## 利点
- **エラーが発生しにくい**: ヒアドキュメントを使用することで、複数行のコードを確実に実行できます
- **コードが読みやすい**: 複雑なクエリも見やすく記述できます
- **Claude Codeとの互換性**: `:|: ;`により、Claude Codeの自動挿入機能による問題を確実に回避できます

Discussion