CRLF Issue in Output Formatting

usabilityActiveStable

The Azure CLI outputs CRLF on Windows, causing issues in shell loops that expect LF, leading to misleading HTTP 400 errors.

Opportunity Score (Heuristic (unvalidated)):62 · High · heuristic
First seen: 5/15/2026
Last seen: 10/17/2026

Score Breakdown

Heuristic ranking from public discussion signals — not a validated prediction of commercial opportunity, demand, or willingness to pay.

Composite 62/100 (High, unvalidated). Top driver: Severity (25% weight, 20 pts).

Frequency · 25% · 11.3 pts · XPS relevance45

Heuristic only — often urgency map or random scaffolding on ingest, not measured mention frequency. Maps to XPS relevance (with market size).

Severity · 25% · 20 pts · XPS quality80

LLM/mock judgment of intensity from title/summary text — not ops or ticket data. Maps to XPS quality (with willingness to pay).

Willingness to pay · 30% · 19.5 pts · XPS quality65

LLM/mock purchase-intent guess from text — not invoices, surveys, or paid seats. Maps to XPS quality.

Trend · 10% · 5.4 pts · XPS novelty54

Heuristic/scaffold (often random or fixed on insert) — not a verified mention trajectory. Maps to XPS novelty.

Market size · 10% · 5.4 pts · XPS relevance54

Heuristic/scaffold (often random or fixed) — not TAM research. Maps to XPS relevance (with frequency).

Catalog notes (not predictive analysis)

CRLF Issue in Output Formatting (usability). Catalog heuristic opportunity score: 62/100 — a chosen formula over discussion-signal facets, not evidence of demand, conversion, or willingness to pay. Treat as browsing rank, not a commercial prediction.

The Azure CLI outputs CRLF on Windows, causing issues in shell loops that expect LF, leading to misleading HTTP 400 errors.

Source Examples

azure/azure-cli Issues·May 15, 2026
“`-o tsv` emits CRLF on Windows, breaking `for x in $(az ... -o tsv)` shell loops with misleading 400 errors ### Describe the bug On Windows, `az ... --output tsv` writes each row terminated by **CRLF** (`\r\n`) instead of LF (`\n`). When that output is consumed by a POSIX shell (Git Bash / MSYS2 / WSL-on-Windows-files / bash-from-PowerShell) via `for x in $(...)`, every token except the last carries a stray `\r`. That `\r` gets interpolated into the URL path of the next `az` call, and ARM responds with `HTTP 400 Bad Request`. The CLI's error message — `Operation returned an invalid status 'Bad Request'` — does not reveal the underlying cause. Net effect: a common shell pattern shown in many Microsoft Learn tutorials silently fails on Windows for every iteration **except the last one** in the loop. ### To Reproduce Any namespace/topic combination works. Example using Service Bus: ```bash RG=<your-rg> NS=<your-namespace> for topic in $(az servicebus topic list --resource-group "$RG" --namespace-name "$NS" --query "[].name" -o tsv); do count=$(az servicebus topic subscription list --resource-group "$RG" --namespace-name "$NS" --topic-name "$topic" --query "length(@)" -o tsv 2>&1) printf "%-40s %s\n" "$topic" "$count" done ``` Actual output (14 topics, only the alphabetically last works): ``` topic1 ERROR: Operation returned an invalid status 'Bad Request' topic2 ERROR: Operation returned an invalid status 'Bad Request' ``` ### Environment summary ``` azure-cli 2.80.0 core 2.80.0 telemetry 1.1.0 Extensions: account 0.2.5 authV2 1.0.1 azure-devops 1.0.2 redisenterprise 1.4.0 subscription 0.1.3 Dependencies: msal 1.34.0b1 azure-mgmt-resource 23.3.0 Python location 'C:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe' OS: Windows 11 Pro 10.0.26200 Shell: Git Bash (MSYS2 / mintty); also reproducible from PowerShell-invoked bash subshells ``` ### Proof of root cause `az ... -o tsv` writes CRLF row terminators on Windows: ```bash The bash `$(...)` substitution then carries `\r` on every token except the last (bash strips a trailing `\n` and the `\r` just before it in that single edge case — the other tokens keep their `\r` because the `\r` precedes a non-terminal `\n`). When the next `az` call receives `--topic-name "$topic"`, the inner CLI inserts the `\r` into the ARM REST URL path. ARM responds 400. The CLI surfaces only `Operation returned an invalid status 'Bad Request'` and does not echo the ARM error body, so the cause is invisible to the user. ### Workaround Strip `\r` from the captured output: ```bash for topic in $(az servicebus topic list --resource-group "$RG" --namespace-name "$NS" --query "[].name" -o tsv | tr -d '\r'); do count=$(az servicebus topic subscription list --resource-group "$RG" --namespace-name "$NS" --topic-name "$topic" --query "length(@)" -o tsv) printf "%-40s %s\n" "$topic" "$count" done ``` ### Proof of root cause `az ... -o tsv` writes CRLF row terminators on Windows: ```bash $ az servicebus topic list --resource-group "$RG" --namespace-name "$NS" --query "[].name" -o tsv | head -3 | od -c 0000000 t o p i c 1 \r \n t o p i c 2 \r \n 0000020 t o p i c 3 \r \n 0000030 ``` After applying `| tr -d '\r'` the loop returns the expected counts for all 14 topics. ### Comparison of output formats on Windows | Output mode | Line ending | Safe in shell `for` loops? | |---|---|---| | `-o tsv` | **CRLF** | **No — this bug** | | `-o json` | LF | n/a (not row-delimited) | | `-o jsonc` | LF | n/a | | `-o yaml` | LF | n/a | | `-o table` | CRLF (decorative) | n/a | Only the **machine-parseable, row-delimited** format `tsv` is affected. `csv` likely has the ”
— dmytroslotvinskyy↗

Competitive Landscape

  • Existing solutions are either too expensive or too limited
  • Most competitors target enterprise, leaving mid-market underserved
  • Community scripts and manual processes are the primary alternative

Recommended Next Steps

  1. ✓Validate pain intensity with 5-10 target customer interviews
  2. ✓Build minimal viable solution addressing the core workflow
  3. ✓Test pricing with early adopters from community forums

Related Pain Points

Target Customers

  • IT teams at mid-size organizations (100-2000 employees)
  • MSPs and consultants managing multiple client environments
  • Teams without dedicated specialist staff for this domain

Monetization Ideas

  1. 1SaaS subscription model ($99-$499/month depending on scale)
  2. 2Usage-based pricing aligned with value delivered
  3. 3Freemium tier to drive adoption and prove value