{"version":"2.1.315","anchor":"shell-parser-rejects-heredoc-opened-inside-a-substitution-th","canonical_anchor":"shell-parser-rejects-heredoc-opened-inside-a-substitution-th","heading":"Shell commands with heredocs that cut across a substitution are refused","tier":"notice","area":"Bash Safety","scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.315\/e\/shell-parser-rejects-heredoc-opened-inside-a-substitution-th","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.315","markdown":"### Shell commands with heredocs that cut across a substitution are refused\n\nClaude Code now refuses to parse shell commands where a heredoc and a `$( ... )` or `\n\n**What**\n\nBefore running a shell command, Claude Code parses it, meaning it works out the command's structure, to check permissions. It now refuses to parse two kinds of command:\n\n- a heredoc opened inside `$( ... )` or `<( ... )` whose closing `)` comes on the same line, before the heredoc's text\n\n- a `$( ... )` or `<( ... )` that runs on past the end of a line that opened its own heredoc\n\nA heredoc is a block of text fed into a command, and `$( ... )` or `<( ... )` runs one command inside another. This handling is part of an option that is on by default.\n\n**Why**\n\nThese layouts could be read one way by Claude Code's permission check and another way by the shell. Refusing them stops a command from passing the check under a misreading.\n\n- Area: Bash Safety\n- Tier: You'll notice\n- Useful: 1\/5\n- Signal: 1\/5\n- Scope: individual\n- Heads-up: yes"}