{"record":{"id":"f81f59ccfbe81c60","repo":"nodejs/node","slug":"write-to-standard-output-already-set-n","errorCode":null,"errorMessage":"write to standard output already set\\n","messagePattern":"write to standard output already set\\\\n","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"deps/brotli/c/tools/brotli.c","lineNumber":570,"sourceCode":"        params->copy_stat = BROTLI_FALSE;\n      } else if (strcmp(\"rm\", arg) == 0) {\n        if (keep_set) {\n          fprintf(stderr, \"argument --rm / -j or --keep / -k already set\\n\");\n          return COMMAND_INVALID;\n        }\n        keep_set = BROTLI_TRUE;\n        params->junk_source = BROTLI_TRUE;\n      } else if (strcmp(\"squash\", arg) == 0) {\n        if (squash_set) {\n          fprintf(stderr, \"argument --squash / -s already set\\n\");\n          return COMMAND_INVALID;\n        }\n        squash_set = BROTLI_TRUE;\n        params->reject_uncompressible = BROTLI_TRUE;\n        continue;\n      } else if (strcmp(\"stdout\", arg) == 0) {\n        if (output_set) {\n          fprintf(stderr, \"write to standard output already set\\n\");\n          return COMMAND_INVALID;\n        }\n        output_set = BROTLI_TRUE;\n        params->write_to_stdout = BROTLI_TRUE;\n      } else if (strcmp(\"test\", arg) == 0) {\n        if (command_set) {\n          fprintf(stderr, \"command already set when parsing --test\\n\");\n          return COMMAND_INVALID;\n        }\n        command_set = BROTLI_TRUE;\n        command = COMMAND_TEST_INTEGRITY;\n      } else if (strcmp(\"verbose\", arg) == 0) {\n        if (params->verbosity > 0) {\n          fprintf(stderr, \"argument --verbose / -v already set\\n\");\n          return COMMAND_INVALID;\n        }\n        params->verbosity = 1;\n      } else if (strcmp(\"version\", arg) == 0) {","sourceCodeStart":552,"sourceCodeEnd":588,"githubUrl":"https://github.com/nodejs/node/blob/1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e/deps/brotli/c/tools/brotli.c#L552-L588","documentation":"The `--stdout` (alias `-c`) flag directs compressed/decompressed output to standard output instead of a file. The parser uses `output_set` to enforce single specification; a second occurrence is rejected with COMMAND_INVALID. Note `output_set` is shared with `--output=`, so `--stdout` and `--output=` are also mutually exclusive.","triggerScenarios":"Invoking `brotli --stdout --stdout file`, `brotli -c --output=out file`, or piping in a script that adds `-c` while a default alias already sets it.","commonSituations":"Shell aliases (e.g. `alias brotli='brotli -c'`) colliding with explicit output flags; piping scripts that always want stdout but layer flags from multiple sources.","solutions":["Remove the duplicate; use exactly one of `--stdout`/`-c` or `--output=PATH`.","If you need file output, drop `--stdout` and use `--output=`.","Inspect `alias brotli` and any `BROTLI_OPTS` env var for stray `-c`."],"exampleFix":"# before\nbrotli -c --stdout input.txt.br\n# after\nbrotli -c input.txt.br","handlingStrategy":"validation","validationCode":"# --stdout/-c and --output= share one slot; reject conflicts and duplicates.\nout_re='(^|[[:space:]])(--stdout|-c)([[:space:]]|$)'\nocc=0\nfor a in \"$@\"; do\n  case \"$a\" in\n    --stdout|-c) occ=$((occ+1));;\n    --output=*) occ=$((occ+1));;\n  esac\ndone\n[ \"$occ\" -gt 1 ] && { echo 'multiple output destinations' >&2; exit 2; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not alias brotli with `-c`; let callers opt in.","When piping, omit `--output=`; when writing files, omit `-c`.","Centralize output-destination logic in one place per invocation."],"tags":["brotli","cli","argument-parsing","duplicate-flag","output"],"backgroundTag":null,"analyzedSha":"1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e","analyzedAt":"2026-08-13T00:53:24.642Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}