[bug-bash] Multi-statement -c and piped stdin silently drop intermediate output and file redirections

Offen
#277 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@mkrueger arbeitet bereits daran.

Seit 04.11.2026.

  • #286 von @mkrueger — offen

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
75/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
csharp
Bereich
backend, cli

Rechercherichtung

Start with ShellInterpreter.RunCommandAsync and compare how it runs parsed statements with CommandStatement handling script-file execution; the issue identifies both as investigation leads. Reproduce with the provided -c commands and piped stdin, then check output and redirected files. Done when intermediate output and each redirection are preserved, including when a later command fails.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug bug-bash

Environment

  • Windows x64
  • CosmosDBShell 1.1.291-preview (db49321323), installed global-tool executable
  • No database connection, credentials, or customer data required

Repro (PowerShell)

Run in a fresh disposable working directory. Invoke the tested executable
explicitly to avoid an older executable on PATH:

$package = "$env:USERPROFILE\.dotnet\tools\.store\cosmosdbshell\1.1.291-preview"
$shell = Join-Path $package 'cosmosdbshell.win-x64\1.1.291-preview\tools\net10.0\win-x64\CosmosDBShell.exe'
$work = Join-Path ([IO.Path]::GetTempPath()) ("cosmos-output-" + [guid]::NewGuid().ToString("N"))
New-Item -ItemType Directory -Path $work | Out-Null
Set-Location $work
& $shell --version
& $shell --output json --quiet -c 'echo "first" > result.txt; echo "second" >> result.txt'
$code = $LASTEXITCODE
Get-Content .\result.txt
"Exit code: $code"

Expected

result.txt contains both lines, in order:

first
second

Actual

result.txt contains only:

second

The process exits 0 and stderr is empty. The failure reproduces on repeat runs
using fresh destination files.

Additional comparisons

  1. Separate destinations:
& $shell --output json --quiet -c 'echo "alpha" > alpha.txt; echo "beta" > beta.txt'

Actual: beta.txt exists with "beta"; alpha.txt is not created.

  1. No redirection:
& $shell --output json --quiet -c 'echo "first"; echo "second"'

Actual stdout: only "second".

  1. Piped stdin:
@'
echo "first" > stdin.txt
echo "second" >> stdin.txt
'@ | & $shell --output json --quiet

Actual: stdin.txt contains only "second".

  1. Earlier successful command followed by a runtime failure:
& $shell --output json --quiet -c 'echo "before" > before-error.txt; not-a-real-command'

Actual: exit 2 with a structured error, but before-error.txt is not created.

  1. Redirect an entire script inside the Cosmos DB Shell language:
@'
echo "first"
echo "second"
'@ | Set-Content -Encoding utf8 .\inner.csh

& $shell --output json --quiet -c 'inner.csh > whole-script.txt'
Get-Content .\whole-script.txt

Actual: whole-script.txt contains only "second". Running
inner.csh >> whole-script-append.txt against a new file preserves both lines.
This is in-shell script redirection, not operating-system redirection of the
entire CLI process.

Working controls / workaround

  • Running the two commands in separate shell processes preserves both lines.
  • A .csh script file containing the same two lines preserves both lines:
@'
echo "first" > script.txt
echo "second" >> script.txt
'@ | Set-Content .\repro.csh
& $shell --output json --quiet -c 'repro.csh'
Get-Content .\script.txt

Actual script.txt: "first" followed by "second".

Impact

Inline CLI automation and piped scripts can silently lose output/artifacts while
reporting success. Behavior differs from running the same statements in a script
file. This can hide logs and skip expected file creation in automation.

Investigation lead (not a verified fix)

The current source's ShellInterpreter.RunCommandAsync runs parsed statements
without rendering each intermediate state. Script-file execution in
CommandStatement renders statement results individually. This is consistent
with the observed difference; the released executable was tested directly,
and no source changes were made.

Validation scope

45 local, disconnected CLI smoke checks: 44 passed, 1 failed.
Covered arithmetic, interpolation, loops, functions, script arguments/scoping,
JSON filters, parser preflight, error envelopes, exit codes, stdin and redirection.
Nine focused follow-up invocations compared the failure against working controls.
These output-loss reproductions require no connected Cosmos DB operations.
The whole-script redirection variant was independently confirmed during
subsequent focused command testing.

Vorherrschende Sprache
C#
Sterne
4
Forks
7
Ø Merge
1 T. 23 Std.
Gemergte PRs (30 T.)
23

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus Azure/CosmosDBShell

Alle Issues in Azure/CosmosDBShell

Ähnliche Issues

Weitere Issues zu C#

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.