linux — & quot; встроенный: не найден & quot; когда я пишу скрипт через PHP passthru ()

Я установил RVM через https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer

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

После того, как я его установлю, мне понадобится ~/.rvm/scripts/rvm на основе Инструкция по установке.
Мне нужно сделать это, выполнив скрипт через 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) и выполнить его, ошибок не вижу.

Мне кажется, что скрипт RVM пытается выполнить 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

1

Решение

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

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

3

Другие решения

Других решений пока нет …