Stderr/Stdout Interleaving Broken in Claude Code's Bash Tool Execution
Resolved 💬 4 comments Opened Jun 29, 2025 by brandonbloom Closed Dec 10, 2025
Bug Description
Claude Code's bash tool does not preserve interleaving of stdout and stderr. If you print to unbuffered stdout and stderr from Go with out1/err1/out2/err2 pattern, you get out1/out2/err1/err2, and this can cause confusing behavior when a tool uses both out and err channels and does correct line buffering / flushing.
Environment Info
- Platform: darwin
- Terminal: vscode
- Version: 1.0.33
- Feedback ID: 5df98393-266f-46d9-ac30-90fc2794d4c7
Test Program
interleave.go:
package main
import (
"fmt"
"os"
)
func main() {
fmt.Fprintln(os.Stdout, "stdout line 1")
fmt.Fprintln(os.Stderr, "stderr line 1")
fmt.Fprintln(os.Stdout, "stdout line 2")
fmt.Fprintln(os.Stderr, "stderr line 2")
}
Run in claude: !go run ./interleave.go
Outputs:
stdout line 1
stdout line 2
stderr line 1
stderr line 2
But it should output:
stdout line 1
stderr line 1
stdout line 2
stderr line 2
Workaround:
!go run ./interleave.go 2>&1This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗