{"record":{"id":"5e8866169084871e","repo":"hashicorp/terraform","slug":"invalid-null-string-in-scripts","errorCode":null,"errorMessage":"invalid null string in 'scripts'","messagePattern":"invalid null string in 'scripts'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/builtin/provisioners/remote-exec/resource_provisioner.go","lineNumber":158,"sourceCode":"\n\treturn resp\n}\n\nfunc (p *provisioner) Stop() error {\n\tp.cancel()\n\treturn nil\n}\n\nfunc (p *provisioner) Close() error {\n\treturn nil\n}\n\n// generateScripts takes the configuration and creates a script from each inline config\nfunc generateScripts(inline cty.Value) ([]string, error) {\n\tvar lines []string\n\tfor _, l := range inline.AsValueSlice() {\n\t\tif l.IsNull() {\n\t\t\treturn nil, errors.New(\"invalid null string in 'scripts'\")\n\t\t}\n\n\t\ts := l.AsString()\n\t\tif s == \"\" {\n\t\t\treturn nil, errors.New(\"invalid empty string in 'scripts'\")\n\t\t}\n\t\tlines = append(lines, s)\n\t}\n\tlines = append(lines, \"\")\n\n\treturn []string{strings.Join(lines, \"\\n\")}, nil\n}\n\n// collectScripts is used to collect all the scripts we need\n// to execute in preparation for copying them.\nfunc collectScripts(v cty.Value) ([]io.ReadCloser, error) {\n\t// Check if inline\n\tif inline := v.GetAttr(\"inline\"); !inline.IsNull() {","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/builtin/provisioners/remote-exec/resource_provisioner.go#L140-L176","documentation":"Error from generateScripts() while iterating the 'inline' list of the remote-exec provisioner: a list element is null (cty.NullVal). Each inline entry must be a non-null string.","triggerScenarios":"provisioner \"remote-exec\" { inline = [\"echo hi\", null] } — a null element, commonly produced by a list variable containing a null item.","commonSituations":"A variable like var.commands that includes a null element (e.g. conditional that yields null); compact() not applied to a sparse list.","solutions":["Filter nulls out of the inline list, e.g. inline = [for c in var.commands : c if c != null].","Ensure every element of the list variable is a concrete string."],"exampleFix":"// before\nvariable \"commands\" { type = list(string) }\nprovisioner \"remote-exec\" {\n  inline = var.commands\n}\n// after\nprovisioner \"remote-exec\" {\n  inline = [for c in var.commands : c if c != null]\n}","handlingStrategy":"validation","validationCode":"# Strip null entries from inline before passing to the provisioner:\n# inline = [for c in var.commands : c if c != null]\n# Or type the variable so nulls cannot enter:\nvariable \"commands\" { type = list(string) }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Type list variables as list(string), not list(any).","Apply compact()/filter to drop nulls from generated lists.","Validate module inputs with terraform validate in CI."],"tags":["terraform","provisioner","remote-exec","config-validation","hcl"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}