{"record":{"id":"8aeb9997576f3155","repo":"puppetlabs/puppet","slug":"option-arg-needs-a-parameter","errorCode":null,"errorMessage":"option '%{arg}' needs a parameter","messagePattern":"option '%(.+?)' needs a parameter","errorType":"exception","errorClass":"CommandlineError","httpStatus":null,"severity":"error","filePath":"lib/puppet/util/command_line/trollop.rb","lineNumber":422,"sourceCode":"        case type\n        when :depends\n          syms.each { |sym| raise CommandlineError, _(\"--%{value0} requires --%{value1}\") % { value0: @specs[constraint_sym][:long], value1: @specs[sym][:long] } unless given_args.include? sym }\n        when :conflicts\n          syms.each { |sym| raise CommandlineError, _(\"--%{value0} conflicts with --%{value1}\") % { value0: @specs[constraint_sym][:long], value1: @specs[sym][:long] } if given_args.include?(sym) && (sym != constraint_sym) }\n        end\n      end\n\n      required.each do |sym, _val|\n        raise CommandlineError, _(\"option --%{opt} must be specified\") % { opt: @specs[sym][:long] } unless given_args.include? sym\n      end\n\n      ## parse parameters\n      given_args.each do |sym, given_data|\n        arg = given_data[:arg]\n        params = given_data[:params]\n\n        opts = @specs[sym]\n        raise CommandlineError, _(\"option '%{arg}' needs a parameter\") % { arg: arg } if params.empty? && opts[:type] != :flag\n\n        vals[\"#{sym}_given\".intern] = true # mark argument as specified on the commandline\n\n        case opts[:type]\n        when :flag\n          if arg =~ /^--no-/ and sym.to_s =~ /^--\\[no-\\]/\n            vals[sym] = opts[:default]\n          else\n            vals[sym] = !opts[:default]\n          end\n        when :int, :ints\n          vals[sym] = params.map { |pg| pg.map { |p| parse_integer_parameter p, arg } }\n        when :float, :floats\n          vals[sym] = params.map { |pg| pg.map { |p| parse_float_parameter p, arg } }\n        when :string, :strings\n          vals[sym] = params.map { |pg| pg.map(&:to_s) }\n        when :io, :ios\n          vals[sym] = params.map { |pg| pg.map { |p| parse_io_parameter p, arg } }","sourceCodeStart":404,"sourceCodeEnd":440,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/util/command_line/trollop.rb#L404-L440","documentation":"After token resolution, parse converts each option's collected parameters; at trollop.rb:422 any option whose type is not :flag but whose params array is empty raises CommandlineError \"option '--x' needs a parameter\". Params end up empty when the option is the last token on the command line, or when the next token already looks like an option so each_arg claims it as a new option instead of a value (trollop.rb:603-607).","triggerScenarios":"`puppet agent --server` as the last argument; `--server --verbose` (the following token is consumed as an option, leaving --server valueless); a value that itself begins with a dash being classified as an option token.","commonSituations":"Truncated command lines from shell history editing; scripts dropping the value argument; negative numbers or dash-prefixed values that the parser treats as flags.","solutions":["Append the value directly: `--server puppet.example.com`","Use the equals form `--server=puppet.example.com` (trollop.rb:600) so the value cannot be stolen by the next token","For dash-prefixed values, always use the `--opt=value` form","Quote and sanity-check programmatically generated command lines before executing them"],"exampleFix":"# before\n$ mytool --server --verbose\nError: option '--server' needs a parameter\n\n# after\n$ mytool --server=host.example.com --verbose","handlingStrategy":"validation","validationCode":"# Detect value-taking options whose value is missing or dash-prefixed before parse\nflag_names = %w[server environment ca]   # your value-taking long options\nargv.each_with_index do |t, i|\n  name = t[/^--([^=]+)$/, 1]\n  next unless name && flag_names.include?(name)\n  nxt = argv[i + 1]\n  abort \"#{t} needs a value - use #{t}=<value>\" if nxt.nil? || nxt.start_with?('-')\nend","typeGuard":null,"tryCatchPattern":"begin\n  opts = parser.parse(argv)\nrescue Puppet::Util::CommandLine::Trollop::CommandlineError => e\n  raise unless e.message.include?('needs a parameter')\n  name = e.message[/option '(.+)' needs/, 1]\n  abort \"#{name} requires a value (hint: use #{name}=<value>, especially for values starting with '-')\"\nend","preventionTips":["Prefer the equals form (--opt=value); it is immune to values being stolen by the next token","Never let a value-taking option be the last token on the line","Quote and lint generated command lines; check that every --opt has a following non-dash argument"],"tags":["puppet","trollop","cli","option-parsing","missing-value"],"backgroundTag":"missing-option-value","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}