Approving heredoc/complex bash commands creates invalid permission entries that break settings file
Resolved 💬 3 comments Opened Feb 2, 2026 by Ethros19 Closed Feb 5, 2026
Summary
When approving bash commands containing heredocs or special characters, Claude Code adds the literal full command to settings.local.json instead of a valid pattern. These malformed entries fail validation on next session load, causing the entire settings file to be skipped.
Environment
- Claude Code version: latest
- macOS: Darwin 25.3.0
Reproduction
- Run a command like:
```bash
git commit -m "$(cat <<'EOF'
Some commit message
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)"
```
- Approve when prompted
- Check
.claude/settings.local.json- the literal command is added topermissions.allow - Next session shows settings error and skips the file
Actual Behavior
The full literal command gets added:
"Bash(git commit -m \"$\\(cat <<''EOF''\nSome commit message\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nEOF\n\\)\")"
This fails validation with:
The : pattern must be at the end. Move : to the end for prefix matching, or use * for wildcard matching.
The error occurs because colons (:) appear in the command body, not as the :* suffix pattern.
Expected Behavior
Either:
- Normalize complex commands to a valid prefix pattern (e.g.,
Bash(git commit:*)) - Or don't add commands that can't be represented as valid patterns
- Or support a different escaping/quoting mechanism for literal commands
Impact
- Users silently lose all project settings (the error is shown but easy to miss)
- Accumulated permissions from previous sessions are lost
- Users must manually edit the JSON to fix it
---
🤖 Generated with Claude Code
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗