Claude Code now catches more shell commands that could be reinterpreted unsafely by the real shell before running them
What
When Claude Code decides whether a shell command is simple enough to run without invoking the full shell, it now rejects more edge cases that could behave differently than expected:
declare,typeset, andlocalcommands are rejected as too complex unless their operand is a plain variable name with a simple, inert value, since the real shell could otherwise treat it as an array subscript, an expanded name, or a compound assignment.exportandreadonlycommands are now also rejected when their operand looks like an array assignment (matching flag patterns the shell would evaluate as a compound array assignment).unsetno longer just checks for a bare variable name; it also allows a second, more permissive pattern under certain conditions, but anything that still doesn't match either pattern is now rejected as too complex, since the shell might expand or evaluate it unexpectedly.- These rejections are now marked internally with a
differentialflag, replacing a fixed classification that was previously used for these cases.
Why
These checks exist to stop Claude Code from treating a shell command as "simple" when the real shell could actually parse or evaluate it in a surprising way (for example, expanding into an array assignment). Tightening them reduces the chance that a command behaves differently than Claude Code's analysis assumed.
The entry above is what we published on the day. These lines were added later, as Anthropic's own pages caught up, and they sit beside the original rather than replacing it.
When set, Cowork, Chat and Code sessions connect the managed list above and the servers the desktop serves from the administrator's org-plugins directory, plus only servers declared by other plugins (user-installed or marketplace) that mat…third-party/claude-desktop/configuration see the edit
[Cloud sessions](/docs/en/claude-code-on-the-web) don't read your local `~/.claude/settings.json`; hooks there come from the repo, meaning its `.claude/settings.json` in a session with one repository and the plugins it declares in any sess…hooks see the edit
| [`syncClaudeAiPlugins`](#syncclaudeaiplugins) | Stop loading the [plugins enabled on your claude.ai account](/docs/en/plugins-reference#synced-plugins) and stop downloading new ones | Plugins and skills | User, local, or managed |settings-reference see the edit
* [`useAutoModeDuringPlan`](/docs/en/settings-reference#useautomodeduringplan), [`syncClaudeAiSkills`](/docs/en/settings-reference#syncclaudeaiskills), and [`syncClaudeAiPlugins`](/docs/en/settings-reference#syncclaudeaiplugins), where a `…managed-settings see the edit
A small documentation edit on Deploy managed settings touched a line naming local after this was published.