From c7fc12596ba6d8b0fbc263bcf83d037ff2de0220 Mon Sep 17 00:00:00 2001 From: Keenan Brock Date: Wed, 5 Aug 2026 11:16:07 -0400 Subject: [PATCH] Make RUBIES a colon-delimited string instead of an array MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Motivation --- Fix chruby in Claude. Core issue is RUBIES is not set in claude shells. Before --- RUBIES was a bash array, and bash arrays cannot be exported. So every fresh subshell — including every Claude Code Bash tool call — started with an empty RUBIES and chruby failed to resolve any Ruby version, even though RUBY_ROOT, GEM_HOME, and PATH were already set correctly in that same subshell. After --- RUBIES is exported as a colon-delimited string, like PATH, so chruby resolves correctly in any subshell, including Claude's. One side effect: RUBIES now shows up in every child process's environment (e.g. in `env` output), which it never did as an array. --- share/chruby/chruby.sh | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/share/chruby/chruby.sh b/share/chruby/chruby.sh index 7b2b4895..8d9d810f 100644 --- a/share/chruby/chruby.sh +++ b/share/chruby/chruby.sh @@ -1,10 +1,15 @@ CHRUBY_VERSION="0.3.9" -RUBIES=() +RUBIES="" for dir in "$PREFIX/opt/rubies" "$HOME/.rubies"; do - [[ -d "$dir" && -n "$(command ls -A "$dir")" ]] && RUBIES+=("$dir"/*) + if [[ -d "$dir" && -n "$(command ls -A "$dir")" ]]; then + for ruby in "$dir"/*; do + RUBIES="${RUBIES:+$RUBIES:}$ruby" + done + fi done -unset dir +unset dir ruby +export RUBIES function chruby_reset() { @@ -71,7 +76,8 @@ function chruby() ;; "") local dir ruby - for dir in "${RUBIES[@]}"; do + local IFS=: + for dir in $RUBIES; do dir="${dir%%/}"; ruby="${dir##*/}" if [[ "$dir" == "$RUBY_ROOT" ]]; then echo " * ${ruby} ${RUBYOPT}" @@ -84,7 +90,8 @@ function chruby() system) chruby_reset ;; *) local dir ruby match - for dir in "${RUBIES[@]}"; do + local IFS=: + for dir in $RUBIES; do dir="${dir%%/}"; ruby="${dir##*/}" case "$ruby" in "$1") match="$dir" && break ;;