{"record":{"id":"4766f5e9dadcdf81","repo":"grafana/k6","slug":"invalid-environment-variable-name-s","errorCode":null,"errorMessage":"invalid environment variable name '%s'","messagePattern":"invalid environment variable name '(.+?)'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cmd/runtime_options.go","lineNumber":69,"sourceCode":"\tenvironment map[string]string,\n) (lib.RuntimeOptions, error) {\n\t// TODO: refactor with composable helpers as a part of #883, to reduce copy-paste\n\t// TODO: get these options out of the JSON config file as well?\n\topts, err := populateRuntimeOptionsFromEnv(runtimeOptionsFromFlags(flags), environment)\n\tif err != nil {\n\t\treturn opts, err\n\t}\n\n\t// Set/overwrite environment variables with custom user-supplied values\n\tenvVars, err := flags.GetStringArray(\"env\")\n\tif err != nil {\n\t\treturn opts, err\n\t}\n\tfor _, kv := range envVars {\n\t\tk, v := state.ParseEnvKeyValue(kv)\n\t\t// Allow only alphanumeric ASCII variable names for now\n\t\tif !userEnvVarName.MatchString(k) {\n\t\t\treturn opts, fmt.Errorf(\"invalid environment variable name '%s'\", k)\n\t\t}\n\t\topts.Env[k] = v\n\t}\n\n\treturn opts, nil\n}\n\nfunc runtimeOptionsFromFlags(flags *pflag.FlagSet) lib.RuntimeOptions {\n\topts := lib.RuntimeOptions{\n\t\tTestType:                  getNullString(flags, \"type\"),\n\t\tIncludeSystemEnvVars:      getNullBool(flags, \"include-system-env-vars\"),\n\t\tCompatibilityMode:         getNullString(flags, \"compatibility-mode\"),\n\t\tNoThresholds:              getNullBool(flags, \"no-thresholds\"),\n\t\tSummaryMode:               getNullString(flags, \"summary-mode\"),\n\t\tSummaryExport:             getNullString(flags, \"summary-export\"),\n\t\tNewMachineReadableSummary: getNullBool(flags, \"new-machine-readable-summary\"),\n\t\tTracesOutput:              getNullString(flags, \"traces-output\"),\n\t\tEnv:                       make(map[string]string),","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/grafana/k6/blob/01ffac6f245854c1b8adc6a69857c76a15f90022/internal/cmd/runtime_options.go#L51-L87","documentation":"Every --env/-e entry is split on the first '=' and the key must match ^[a-zA-Z_][a-zA-Z0-9_]*$: ASCII letter or underscore first, then letters, digits, or underscores. Keys with dashes, dots, spaces, a leading digit, or an empty key ('=value') are rejected at startup. This keeps user env vars safely exposable to both the JS runtime and the OS.","triggerScenarios":"k6 run -e 'MY-VAR=1' script.js (dash); -e '2FA=x' (leading digit); -e 'my.var=1' (dot); -e '=value' (empty key); values themselves are unrestricted — only the key is validated.","commonSituations":"Passing CI variable names (MY-APP-KEY, BUILD.ID) verbatim; copying names from other tools' env conventions; shell scripts building -e flags from filenames with dashes.","solutions":["Rename the key to use underscores: -e MY_VAR=1","If the odd name is mandatory, set it as a real environment variable for the process instead of using -e","Transform keys programmatically when generating flags: key=${key//[-.]/_}"],"exampleFix":"# before\nk6 run -e \"MY-VAR=1\" script.js\n\n# after\nk6 run -e \"MY_VAR=1\" script.js","handlingStrategy":"validation","validationCode":"# validate every -e key against k6's rule before running\nvalid_k6_env_key() { [[ \"$1\" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; }\nfor kv in \"MY-VAR=1\" \"ok_var=2\"; do\n  key=\"${kv%%=*}\"\n  valid_k6_env_key \"$key\" || { echo \"invalid env var name '$key'\" >&2; exit 1; }\ndone\nk6 run -e \"MY_VAR=1\" -e ok_var=2 script.js","typeGuard":"valid_k6_env_key() { [[ \"$1\" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]] && return 0 || return 1; }\n# usage: valid_k6_env_key \"MY_VAR\" && k6 run -e \"MY_VAR=1\" script.js","tryCatchPattern":null,"preventionTips":["Use underscores-only naming for anything passed via -e; transform CI names before building the command","Remember the regex ^[a-zA-Z_][a-zA-Z0-9_]*$ — dashes, dots, and leading digits are all rejected","Values are never validated — only keys; quote entries so the shell doesn't mangle '=' splitting"],"tags":["k6","environment-variables","cli-flag","env","validation"],"backgroundTag":"invalid-env-var-name","analyzedSha":"01ffac6f245854c1b8adc6a69857c76a15f90022","analyzedAt":"2026-08-18T03:05:52.393Z","contentChangedAt":"2026-08-18T03:05:52.393Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}