2015-05-08 2 views
1

Я установил РВМ через https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer«встроенный: не найден», когда я закупаем скрипт через PHP PASSTHRU()

я на Ubuntu, и я использую Bash.

После того, как я установил его, мне нужно указать источник ~/.rvm/scripts/rvm на основе installation instructions. Мне нужно сделать это, выполнив скрипт через CLI (test.sh), который, в свою очередь, вызывает скрипт PHP (test.php), который выполняет поиск через команды оболочки. После того, как я делаю это, я получаю эту ошибку о builtin:

$ ./test.sh 
sh: 10: /home/housni/.rvm/scripts/rvm: builtin: not found 

Это test.sh работает на Bash, который вызывает test.php

#!/bin/bash 
./test.php 

Это test.php

#!/usr/bin/php -q 
<?php 
    passthru('. ~/.rvm/scripts/rvm'); 
?> 

Когда я введите source ~/.rvm/scripts/rvm непосредственно в терминал (bash) и выполните его, я не вижу ошибок.

Мне кажется, как сценарий РВМ пытается выполнить dash вместо bash, но это не делает полный смысл либо потому, что скрипт RVM начинается с #!/usr/bin/env bash.

Любая идея, что я делаю неправильно в своем PHP-скрипте?

Вот содержание ~/.rvm/scripts/rvm:

#!/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>/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}$" >/dev/null 2>&1 || return $? 
    elif # mksh 
    [[ -n "${KSH_VERSION}" ]] 
    then 
    set +o | GREP_OPTIONS="" \command \grep "-o ${1}$" >/dev/null 2>&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:-}" ]] && ! [[ "$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" >/dev/null 2>&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:-$_}" && -f "${BASH_SOURCE:-$_}" ]] 
    then 
    rvm_path="${BASH_SOURCE:-$_}" 
    rvm_path="$(\command \cd "${rvm_path%/scripts/rvm}">/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" && -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. %%/ <- 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:-}" ]] && 
    \typeset -f rvm >/dev/null 2>&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}" && -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>/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>/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:-}" && 
      -s "${rvm_environments_path}/default" 
      ]] 
     then 
      source "${rvm_environments_path}/default" 
     elif 
      [[ "${rvm_environments_path:-}" != "${rvm_path}/environments" && 
      -s "${rvm_path}/environments/default" 
      ]] 
     then 
      source "${rvm_path}/environments/default" 
     fi 
     if 
      [[ ${rvm_project_rvmrc:-1} -gt 0 ]] && 
      ! __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}"* ]] && 
     [[ -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 
" >&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 
" >&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 >/dev/null 2>&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 

ответ

3

Запуск сценария, как . ~/.rvm/scripts/rvm не использует свою хижину линию. Он запускает скрипт в текущую оболочку. Текущая оболочка для passthru выглядит, как представляется, /bin/sh (что разумно, большинство вещей по умолчанию используют /bin/sh).

Если вы хотите использовать скрипт скрипта, то вам необходимо оставить команду ./source.

+0

Итак, вы говорите, что я должен просто сделать 'passthru ('~/.rvm/scripts/rvm');' без [точки] или 'source'? Это то, что вы сказали о '/ bin/sh', потому что'/bin/sh' указывает на 'dash' в моей системе. – Housni

+0

Кроме того, не факт, что строка shebang '~/.rvm/scripts/rvm' использует' #!/Usr/bin/env bash', делает этот сценарий использованием 'bash' вместо'/bin/sh' ? – Housni

+1

Да, используйте путь напрямую. Поскольку я сказал, что строка shebang * не * используется для сценариев с источниками. Строки shebang используются ** только ** для скриптов, которые запускаются напрямую (если вы запустили '/ bin/sh ~/.rvm/scripts/rvm', он тоже не использовал бы строку shebang). –

 Смежные вопросы

  • Нет связанных вопросов^_^