Skip to content

asdf which java writes error message to stdout instead of stderr #266

Description

@steinybot

Bug

asdf which java outputs its error message to stdout instead of stderr when no java version is configured:

$ java_path="$(asdf which java 2>/dev/null)"
$ echo "java_path='$java_path'"
java_path='unexpected error: no versions set for java'

Impact

set-java-home.zsh captures this error string into java_path via $(). Because the string is non-empty, the [[ -n "${java_path}" ]] guard passes and the hook proceeds to compute:

JAVA_HOME="$(dirname "$(dirname "${java_path:A}")")"

The :A modifier in zsh resolves relative paths against $PWD, so "unexpected error: no versions set for java" (no leading /) becomes $PWD/unexpected error: no versions set for java. Two dirname calls then strip the last two components, leaving:

JAVA_HOME = dirname(dirname($PWD))

The result is a silently wrong, directory-dependent JAVA_HOME — it changes every time you cd:

~
❯ grails -version
ERROR: JAVA_HOME is set to an invalid directory: /Users

~/src/dotfiles
❯ grails -version
ERROR: JAVA_HOME is set to an invalid directory: /Users/jason/src

Expected behavior

Error messages should go to stderr so that $() captures only meaningful output.

Environment

  • macOS Darwin 25.3.0
  • zsh
  • asdf-java plugin (halcyon/asdf-java)
  • No java version set in .tool-versions

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions