From dc14008f31815f30ffaa4acde05b13c1d05db829 Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Mon, 8 Dec 2025 10:18:54 -0800 Subject: [PATCH] fix: add symlink check before calling readlink for uutils compatibility The uutils/coreutils implementation of readlink emits error messages to stderr when invoked on non-symlinks (regular files or directories): readlink: : Invalid argument By contrast, BSD and GNU readlink fail silently. This caused unwanted error output when using jenv with uutils/coreutils. The resolve_link() function is used in abs_dirname() to traverse paths, and may be called on non-symlinks during normal operation. This fix adds a symlink check using [ -L "$1" ] before invoking readlink, which: - Prevents spurious error messages from uutils readlink - Maintains compatibility with BSD, GNU, and uutils implementations - Preserves real error visibility by only calling readlink on symlinks - Avoids the need to suppress stderr which would hide genuine errors --- libexec/jenv | 4 +++- libexec/jenv-doctor | 4 +++- libexec/jenv-hooks | 4 +++- libexec/jenv-init | 4 +++- libexec/jenv-plugins | 4 +++- libexec/jenv-refresh-plugins | 4 +++- libexec/jenv-refresh-versions | 4 +++- 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/libexec/jenv b/libexec/jenv index cf0c3f7..db802d7 100755 --- a/libexec/jenv +++ b/libexec/jenv @@ -3,7 +3,9 @@ set -e [ -n "$JENV_DEBUG" ] && set -x resolve_link() { - $(type -p greadlink readlink | head -1) "$1" + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } abs_dirname() { diff --git a/libexec/jenv-doctor b/libexec/jenv-doctor index 61669ec..7e0c0df 100755 --- a/libexec/jenv-doctor +++ b/libexec/jenv-doctor @@ -26,7 +26,9 @@ function cfix() { } resolve_link() { - $(type -p greadlink readlink | head -1) "$1" + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } set -e diff --git a/libexec/jenv-hooks b/libexec/jenv-hooks index a68c15e..1d7aeb1 100755 --- a/libexec/jenv-hooks +++ b/libexec/jenv-hooks @@ -25,7 +25,9 @@ if [ -z $shell ]; then fi resolve_link() { - $(type -p greadlink readlink | head -1) $1 + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } realpath() { diff --git a/libexec/jenv-init b/libexec/jenv-init index 52f8b2d..3f943e9 100755 --- a/libexec/jenv-init +++ b/libexec/jenv-init @@ -30,7 +30,9 @@ if [ -z "$shell" ]; then fi resolve_link() { - $(type -p greadlink readlink | head -1) $1 + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } abs_dirname() { diff --git a/libexec/jenv-plugins b/libexec/jenv-plugins index f9bd9f3..657a2e4 100755 --- a/libexec/jenv-plugins +++ b/libexec/jenv-plugins @@ -14,7 +14,9 @@ fi resolve_link() { - $(type -p greadlink readlink | head -1) "$1" + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } samedir() { diff --git a/libexec/jenv-refresh-plugins b/libexec/jenv-refresh-plugins index d3d72f1..bfd22f9 100755 --- a/libexec/jenv-refresh-plugins +++ b/libexec/jenv-refresh-plugins @@ -2,7 +2,9 @@ # Summary: Refresh plugins links resolve_link() { - $(type -p greadlink readlink | head -1) "$1" + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } set -e diff --git a/libexec/jenv-refresh-versions b/libexec/jenv-refresh-versions index de016a5..d0d4a7d 100755 --- a/libexec/jenv-refresh-versions +++ b/libexec/jenv-refresh-versions @@ -2,7 +2,9 @@ # Summary: Refresh alias names resolve_link() { - $(type -p greadlink readlink | head -1) "$1" + if [ -L "$1" ]; then + $(type -p greadlink readlink | head -1) "$1" + fi } set -e