title: "builtin: not found" when I source a script via PHP passthru()
body: <p>I've installed RVM via <a href="https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer" rel="nofollow">https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer</a></p>
  
  <p>I'm on Ubuntu and I use Bash.</p>
  
  <p>Once I install it, I need to be able to source <code>~/.rvm/scripts/rvm</code> based on the <a href="https://rvm.io/rvm/install" rel="nofollow">installation instructions</a>.
  I need to do this by executing a script via CLI (test.sh) which, in turn, calls a PHP script (test.php) that does the sourcing via shell commands.
  Once I do that, I get this error about <code>builtin</code>:</p>
  
  <pre><code>$ ./test.sh
  sh: 10: /home/housni/.rvm/scripts/rvm: builtin: not found
  </code></pre>
  
  <p>This is <code>test.sh</code> running on Bash that calls test.php</p>
  
  <pre><code>#!/bin/bash
  ./test.php
  </code></pre>
  
  <p>This is <code>test.php</code></p>
  
  <pre><code>#!/usr/bin/php -q
  &lt;?php
      passthru('. ~/.rvm/scripts/rvm');
  ?&gt;
  </code></pre>
  
  <p>When I type <code>source ~/.rvm/scripts/rvm</code> directly in a terminal (bash) and execute it, I see no errors.</p>
  
  <p>It seems to me like the RVM script is trying to execute <code>dash</code> instead of <code>bash</code> but that doesn't make complete sense either because the RVM script begins with <code>#!/usr/bin/env bash</code>.</p>
  
  <p>Any idea what I'm doing wrong in my PHP script?</p>
  
  <p>Here are the contents of <code>~/.rvm/scripts/rvm</code>:</p>
  
  <pre><code>#!/usr/bin/env bash
  
  # rvm : Ruby enVironment Manager
  # https://rvm.io
  # https://github.com/wayneeseguin/rvm
  
  # partial duplication marker dkjnkjvnckbjncvbkjnvkj
  # prevent from loading in sh shells
  if
    builtin test -n "${BASH_VERSION:-}" -o -n "${ZSH_VERSION:-}" -o -n "${KSH_VERSION:-}"
  then
    case "`uname`" in
      (CYGWIN*) __shell_name="`\command \ps -p $$ | \command \awk 'END {print $NF}'` 2&gt;/dev/null" ;;
      (SunOS)   __shell_name="`\command \ps -p $$ -o comm=`" ;;
      (*)       __shell_name="`\command \ps -p $$ -o ucomm=`" ;;
    esac
    case "$__shell_name" in
      (""|dash|sh|ksh|*/dash|*/sh|*/ksh) return 0 ;; # silently stop in sh shells
    esac
    unset __shell_name
  else
    return 0
  fi
  
  # also duplicated in scripts/base
  __rvm_has_opt()
  {
    if # pre-gnu
     [[ -n "${ZSH_VERSION}"  ]]
    then
      setopt | GREP_OPTIONS="" \command \grep "^${1}$" &gt;/dev/null 2&gt;&amp;1 || return $?
    elif # mksh
      [[ -n "${KSH_VERSION}"  ]]
    then
      set +o | GREP_OPTIONS="" \command \grep "-o ${1}$" &gt;/dev/null 2&gt;&amp;1 || return $?
    elif # bash
      [[ -n "${BASH_VERSION}" ]]
    then
      [[ ":$SHELLOPTS:" == *":${1}:"* ]] || return $?
    else # what is this?!
      return 1
    fi
  }
  
  # Do not allow sourcing RVM in `sh` - it's not supported
  # return 0 to exit from sourcing this script without breaking sh
  if __rvm_has_opt "posix"
  then return 0
  fi
  
  # TODO: Alter the variable names to make sense
  \export HOME rvm_prefix rvm_user_install_flag rvm_path
  HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME
  
  [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
  if (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if [[ -n "${rvm_prefix:-}" ]] &amp;&amp; ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
  
    for rvmrc in "${rvm_rvmrc_files[@]}"
    do
      if [[ -f "$rvmrc" ]]
      then
        # pre-gnu
        if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" &gt;/dev/null 2&gt;&amp;1
        then
          printf "%b" "
  Error:
          $rvmrc is for rvm settings only.
          rvm CLI may NOT be called from within $rvmrc.
          Skipping the loading of $rvmrc"
          return 1
        else
          source "$rvmrc"
        fi
      fi
    done
    unset rvm_rvmrc_files
  fi
  
  # duplication marker jdgkjnfnkjdngjkfnd4fd
  # detect rvm_path if not set
  if
    [[ -z "${rvm_path:-}" ]]
  then
    if
      [[ -n "${BASH_SOURCE:-$_}" &amp;&amp; -f "${BASH_SOURCE:-$_}" ]]
    then
      rvm_path="${BASH_SOURCE:-$_}"
      rvm_path="$( \command \cd "${rvm_path%/scripts/rvm}"&gt;/dev/null; pwd )"
      rvm_prefix=$( dirname $rvm_path )
    elif
      [[ "${UID:-}" == "0" || "${USER:-}" == "root" ]]
    then
      if
        (( ${rvm_user_install_flag:-0} == 0 ))
      then
        rvm_prefix="/usr/local"
        rvm_path="${rvm_prefix}/rvm"
      else
        rvm_prefix="$HOME"
        rvm_path="${rvm_prefix}/.rvm"
      fi
    else
      if
        [[ -d "$HOME/.rvm" &amp;&amp; -s "$HOME/.rvm/scripts/rvm" ]]
      then
        rvm_prefix="$HOME"
        rvm_path="${rvm_prefix}/.rvm"
      else
        rvm_prefix="/usr/local"
        rvm_path="${rvm_prefix}/rvm"
      fi
    fi
  else
    # remove trailing slashes, btw. %%/ &lt;- does not work as expected
    rvm_path="${rvm_path%%+(\/)}"
  fi
  
  # guess rvm_prefix if not set
  if [[ -z "${rvm_prefix}" ]]
  then
    rvm_prefix=$( dirname $rvm_path )
  fi
  
  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
  [[ -n "${rvm_user_install_flag:-}" ]] ||
  case "$rvm_path" in
    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
    (*)                      rvm_user_install_flag=0 ;;
  esac
  
  export rvm_loaded_flag
  if [[ -n "${BASH_VERSION:-}" || -n "${ZSH_VERSION:-}" ]] &amp;&amp;
    \typeset -f rvm &gt;/dev/null 2&gt;&amp;1
  then
    rvm_loaded_flag=1
  else
    rvm_loaded_flag=0
  fi
  
  if
    (( ${rvm_loaded_flag:=0} == 0 )) || (( ${rvm_reload_flag:=0} == 1 ))
  then
    if
      [[ -n "${rvm_path}" &amp;&amp; -d "$rvm_path" ]]
    then
      true ${rvm_scripts_path:="$rvm_path/scripts"}
  
      if
        [[ ! -f "$rvm_scripts_path/base" ]]
      then
        printf "%b" "WARNING:
        Could not source '$rvm_scripts_path/base' as file does not exist.
        RVM will likely not work as expected.\n"
      elif
        ! source "$rvm_scripts_path/base"
      then
        printf "%b" "WARNING:
        Errors sourcing '$rvm_scripts_path/base'.
        RVM will likely not work as expected.\n"
      else
        __rvm_ensure_is_a_function
        __rvm_setup
  
        export rvm_version
        rvm_version="$(\command \cat "$rvm_path/VERSION") ($(\command \cat "$rvm_path/RELEASE" 2&gt;/dev/null))"
  
        alias rvm-restart="rvm_reload_flag=1 source '${rvm_scripts_path:-${rvm_path}/scripts}/rvm'"
  
        # Try to load RVM ruby if none loaded yet
        __path_to_ruby="$( builtin command -v ruby 2&gt;/dev/null || true )"
        if
          [[ -z "${__path_to_ruby}" ]] ||
          [[ "${__path_to_ruby}" != "${rvm_path}"* ]] ||
          [[ "${__path_to_ruby}" == "${rvm_path}/bin/ruby" ]]
        then
          if
            [[ -n "${rvm_environments_path:-}" &amp;&amp;
              -s "${rvm_environments_path}/default"
            ]]
          then
            source "${rvm_environments_path}/default"
          elif
            [[ "${rvm_environments_path:-}" != "${rvm_path}/environments" &amp;&amp;
              -s "${rvm_path}/environments/default"
            ]]
          then
            source "${rvm_path}/environments/default"
          fi
          if
            [[ ${rvm_project_rvmrc:-1} -gt 0 ]] &amp;&amp;
            ! __function_on_stack __rvm_project_rvmrc
          then
            # Reload the rvmrc, use promptless ensuring shell processes does not
            # prompt if .rvmrc trust value is not stored, revert to default on fail
            if
              rvm_current_rvmrc=""
              rvm_project_rvmrc_default=2 rvm_promptless=1 __rvm_project_rvmrc
            then
              rvm_hook=after_cd
              source "${rvm_scripts_path:-${rvm_path}/scripts}/hook"
            fi
          fi
        elif
          [[ "${__path_to_ruby}" == "${rvm_path}"* ]] &amp;&amp;
          [[ -z "${GEM_HOME:-}" || -z "${GEM_PATH:-}" ]]
        then
          echo "
  Warning: PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, see:
      https://github.com/wayneeseguin/rvm/issues/3212
  " &gt;&amp;2
          if
            [[ -n "${SUDO_USER:-}" ]]
          then
            echo "Hint: To fix PATH errors try using 'rvmsudo' instead of 'sudo', see:
      http://stackoverflow.com/questions/27784961/received-warning-message-path-set-to-rvm-after-updating-ruby-version-using-rvm/28080063#28080063
  " &gt;&amp;2
          fi
        fi
        unset __path_to_ruby
  
        # Makes sure rvm_bin_path is in PATH atleast once.
        [[ ":${PATH}:" == *":${rvm_bin_path}:"* ]] || PATH="$PATH:${rvm_bin_path}"
  
        if
          (( ${rvm_reload_flag:=0} == 1 ))
        then
          [[ "${rvm_auto_reload_flag:-0}" == 2 ]] || printf "%b" 'RVM reloaded!\n'
          unset __rvm_project_rvmrc_lock
        fi
  
        rvm_loaded_flag=1
        __rvm_teardown
  
        # Opt-in for custom prompt through by setting:
        #     rvm_ps1=1
        # in either /etc/rvmrc or $HOME/.rvmrc
        if
          [[ ${rvm_ps1:-0} -eq 1 ]]
        then
          # Source RVM ps1 functions for a great prompt.
          if
            [[ -s "$rvm_path/contrib/ps1_functions" ]]
          then
            source "$rvm_path/contrib/ps1_functions"
          elif
            [[ -s "/usr/local/rvm/contrib/ps1_functions" ]]
          then
            source "/usr/local/rvm/contrib/ps1_functions"
          fi
  
          if command -v ps1_set &gt;/dev/null 2&gt;&amp;1
          then ps1_set
          fi
        fi
  
      fi
    else
      printf "%b" "\n\$rvm_path ($rvm_path) does not exist."
    fi
    unset rvm_prefix_needs_trailing_slash rvm_gems_cache_path rvm_gems_path rvm_project_rvmrc_default rvm_gemset_separator rvm_reload_flag
  fi
  </code></pre>