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

Abierto
#277 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
75/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
csharp
Área
backend, cli

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
C#
Estrellas
4
Forks
7
Merge medio
2 d 2 h
PR fusionados (30 d)
24

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Azure/CosmosDBShell

Todos los issues de Azure/CosmosDBShell

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.