{"record":{"id":"bcb7fb5804b644ec","repo":"ruby/ruby","slug":"please-specify-an-executable-to-run-e-g-progra","errorCode":null,"errorMessage":"Please specify an executable to run (e.g. #{program_name} COMMAND)","messagePattern":"Please specify an executable to run \\(e\\.g\\. #(.+?) COMMAND\\)","errorType":"exception","errorClass":"Gem::CommandLineError","httpStatus":null,"severity":"error","filePath":"lib/rubygems/commands/exec_command.rb","lineNumber":116,"sourceCode":"      if options[:version].none?\n        options[:version] = Gem::Requirement.new(gem_version)\n      else\n        options[:version].concat [gem_version]\n      end\n    end\n\n    if options[:prerelease] && !options[:version].prerelease?\n      if options[:version].none?\n        options[:version] = Gem::Requirement.default_prerelease\n      else\n        options[:version].concat [Gem::Requirement.default_prerelease]\n      end\n    end\n  end\n\n  def check_executable\n    if options[:executable].nil?\n      raise Gem::CommandLineError,\n        \"Please specify an executable to run (e.g. #{program_name} COMMAND)\"\n    end\n  end\n\n  def print_command\n    verbose \"running #{program_name} with:\\n\"\n    opts = options.reject {|_, v| v.nil? || Array(v).empty? }\n    max_length = opts.map {|k, _| k.size }.max\n    opts.each do |k, v|\n      next if v.nil?\n      verbose \"\\t#{k.to_s.rjust(max_length)}: #{v}\"\n    end\n    verbose \"\"\n  end\n\n  def install_if_needed\n    activate!\n  rescue Gem::MissingSpecError","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/ruby/ruby/blob/0e5b888e1c355f3f728f2659f085820937dada48/lib/rubygems/commands/exec_command.rb#L98-L134","documentation":"`gem exec COMMAND [args]` runs an executable provided by an installed gem; check_executable raises Gem::CommandLineError when options[:executable] is nil - i.e. no COMMAND was given after `gem exec`. The check runs during argument validation, before any gem environment is set up, so nothing executes.","triggerScenarios":"`gem exec` with no arguments; `gem exec --keep-files` style invocations where only flags are present; wrappers forwarding an empty variable (gem exec $TOOL with TOOL unset).","commonSituations":"Docker ENTRYPOINT ['gem','exec'] or CI wrappers forwarding a possibly-empty variable; users expecting bare `gem exec` to list available executables (it does not).","solutions":["Name the executable: gem exec rake -T","Guard the variable in scripts: ${TOOL:?tool name required}","Use bundle exec inside Bundler projects; gem exec is for gem-installed tools"],"exampleFix":"# before\nENTRYPOINT [\"gem\", \"exec\"]     # no COMMAND -> error\n# or\ngem exec $TOOL                  # TOOL unset\n\n# after\nENTRYPOINT [\"gem\", \"exec\", \"rake\"]\n: \"${TOOL:?TOOL must be set}\"; gem exec \"$TOOL\"","handlingStrategy":"validation","validationCode":"tool = ARGV.shift\nabort 'Please specify an executable to run (e.g. gem exec COMMAND)' if tool.nil? || tool.empty?\nexec('gem', 'exec', tool, *ARGV)","typeGuard":null,"tryCatchPattern":"begin\n  Gem::Commands::ExecCommand.new.invoke(*args)\nrescue Gem::CommandLineError => e\n  raise unless e.message.include?('executable to run')\n  abort 'usage: gem exec COMMAND [options]'\nend","preventionTips":["Give wrappers an explicit default command or fail fast on empty variables","Remember gem exec does not enumerate executables when run bare","Prefer bundle exec inside Bundler projects; reserve gem exec for gem-installed tools"],"tags":["rubygems","cli","exec","usage-error","argument-validation"],"backgroundTag":"missing-cli-argument","analyzedSha":"0e5b888e1c355f3f728f2659f085820937dada48","analyzedAt":"2026-08-21T14:25:43.473Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}