Невозможно запустить скрипт (исполняемый файл, хеш-бит соответствует оболочке)

Я отрезал вопрос для удобства чтения, хотя это может быть немного жесткое звучание

ПРОБЛЕМА: невозможно выполнить сценарий bash из того, что я считаю оболочкой bash.

ПРЕДПОСЫЛКА: Я пытаюсь начать работу с LibGDX, и они хотят, чтобы я установил Android SDK как часть работы в Eclipse. Таким образом, у меня есть этот скрипт, который должен установить все, что я загрузил.

SPECS: HP Compaq dc7900 Малый форм-фактор Память: 3,8 Гигабайт Графика: Gallium 0.4 на AMD RV620 (DRM 2.46.0 / 4.8.0-52-generic, LLVM 3.8.0)

Процессор: Intel® Core ™ 2 Duo CPU E8400 @ 3.00GHz × 2

ОС: Ubuntu 16.04 64 бит

Android SDK Версия 26.0.2 (апрель 2017 г.) https: / /developer.android.com/studio/releases/sdk-tools.html

ИСТОРИЯ ПРОБЛЕМЫ

Изменены разрешения для исполняемого файла для чтения / записи для всех

https://developer.android.com/studio/releases/sdk-tools.html

Линия хеш-банга в соответствии с выходом команды head

$sudo head -1 android #!/bin/bash

Вывод проверки оболочки

$ echo $0 /bin/bash

Открыл терминал в той же папке, что и целевой скрипт, и попробовал следующие команды с выходом непосредственно под ним.

$ sh android.sh sh: 0: Can't open android.sh $ sudo sh android.sh [sudo] password for joel: [TYPES PASSWORD] sh: 0: Can't open android.sh $sh android android: 24: android: Syntax error: redirection unexpected $sudo sh android android: 24: android: Syntax error: redirection unexpected

] Я также попробовал префикс ~ / и ./, и они не имеют никакого эффекта; единственный шаблон состоит в том, что включение расширения имени файла дает «невозможно открыть», в то время как его исключение дает «перенаправление неожиданно»

. Интересно, что я попытался открыть несуществующий файл eirugheur.sh, и он дал то же самое вид ошибок.

$sudo sh eirugheur.sh sh: 0: Can't open eirugheur.sh

Итак, у меня нет возможности узнать, «Нет ли открытия» означает, что файл отсутствует, или если я выполняю команды.

Спасибо за чтение , любые предложения или обходные пути приветствуются.

EDIT: вывод ls -l

joel@joel-HP-Compaq-dc7900-Small-Form-Factor:~/Downloads/tools$ ls -l total 1680 -rwxrwxrwx 1 joel joel 4741 May 31 15:01 android drwxrwxr-x 2 joel joel 4096 Mar 29 00:46 bin -rwxrw-rw- 1 joel joel 643536 Mar 29 00:46 emulator -rwxrw-rw- 1 joel joel 394336 Mar 29 00:46 emulator-check drwxrwxr-x 6 joel joel 4096 Mar 29 00:46 lib -rwxrw-rw- 1 joel joel 12191 Mar 29 00:46 mksdcard -rwxrw-rw- 1 joel joel 1257 Mar 29 00:46 monitor -rw-rw-rw- 1 joel joel 629709 Mar 29 00:46 NOTICE.txt drwxrwxr-x 7 joel joel 4096 Mar 29 00:46 proguard -rw-rw-rw- 1 joel joel 139 Mar 29 00:46 source.properties drwxrwxr-x 2 joel joel 4096 Mar 29 00:46 support joel@joel-HP-Compaq-dc7900-Small-Form-Factor:~/Downloads/tools$

Am в настоящее время читает ссылку на steeldriver

EDIT: Пробовал ./android

Вывод:

The "android" command is deprecated. For manual SDK, AVD, and project management, please use Android Studio. For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager ************************************************************************* Invalid or unsupported command "" Supported commands are: android list target android list avd android list device android create avd android move avd android delete avd android list sdk android update sdk

Вот скрипт, решение steeldriver, так как это сообщение об ошибке появляется внутри скрипта. Спасибо за вашу помощь, я полагаю, что мне удастся разобраться в следующем:>

#!/bin/bash # Attempt to set app_home # Resolve links: $0 may be a link prg="$0" # Need this for relative symlinks. while [ -h "$prg" ] ; do ls=`ls -ld "$prg"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then prg="$link" else prg=`dirname "$prg"`"/$link" fi done saved="`pwd`" cd "`dirname \"$prg\"`" >/dev/null app_home="`pwd -P`" cd "$saved" >/dev/null ANDROID_WRAPPER_BIN_DIR=${ANDROID_WRAPPER_BIN_DIR:-$app_home/bin} ANDROID_WRAPPER_SDK_TIMEOUT=${ANDROID_WRAPPER_SDK_TIMEOUT:-20} cat <<< \ "************************************************************************* The \"android\" command is deprecated. For manual SDK, AVD, and project management, please use Android Studio. For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager *************************************************************************" function usage { echo "Invalid or unsupported command \"$@\"" echo echo "Supported commands are:" echo "android list target" echo "android list avd" echo "android list device" echo "android create avd" echo "android move avd" echo "android delete avd" echo "android list sdk" echo "android update sdk" exit 2 } function matches { verbs=$1 objects=$2 verb="" object="" shift 2 for arg in "$@"; do if [[ $arg =~ ^- ]]; then continue fi if [[ -z $verb && $verbs =~ ( |^)$arg( |$) ]]; then verb=$arg continue fi if [[ -n $verb && $objects =~ ( |^)$arg( |$) ]]; then object=$arg break fi break done return $([[ -n $verb && -n $object ]]) } function echo_and_exec { echo "Running $@" echo exec $@ } function parse_filter { local IFS=, for filter in $1; do if [[ $filter == tool || $filter == platform-tool || $filter == doc ]]; then command+=( "$args ${filter}s" ) elif [[ $filter == tools || $filter == platform-tools ]]; then command+=( "$args ${filter}" ) elif [[ $filter =~ ^lldb ]]; then command+=( "$args ${filter/-/;}" ) elif [[ $filter =~ ^build-tools ]]; then command+=( "$args ${filter/build-tools-/build-tools;}" ) elif [[ $filter == ndk ]]; then command+=( "$args ndk-bundle" ) elif [[ $filter =~ ^android- ]]; then command+=( "$args platforms;$filter" ) else echo Filter $filter not supported exit 2 fi done } function confirm_try_sdk { for arg in "$@"; do if [[ $arg == --use-sdk-wrapper ]]; then return 0 fi done if [[ -n $USE_SDK_WRAPPER ]]; then return 0 fi read -t $ANDROID_WRAPPER_SDK_TIMEOUT -p "\"android\" SDK commands can be translated to sdkmanager commands on a best-effort basis. Continue? (This prompt can be suppressed with the --use-sdk-wrapper command-line argument or by setting the USE_SDK_WRAPPER environment variable) [y/N]: " trysdkresponse if (( $? > 128 )); then echo "Timed out waiting for input." echo "To suppress this prompt, run with --use-sdk-wrapper or set USE_SDK_WRAPPER." exit 1 fi if [[ ${trysdkresponse,,} == y ]]; then return 0 fi echo Aborted exit 1 } avd_verbs="list create move delete" avd_objects="avd target device" if matches "$avd_verbs" "$avd_objects" "$@"; then echo_and_exec "$ANDROID_WRAPPER_BIN_DIR/avdmanager" "$@" fi sdk_verbs="list update" sdk_objects="sdk" if matches "$sdk_verbs" "$sdk_objects" "$@"; then confirm_try_sdk $@ if [[ $verb == list ]]; then echo_and_exec "$ANDROID_WRAPPER_BIN_DIR/sdkmanager" --list --verbose fi if [[ $verb == update ]]; then command=( "$ANDROID_WRAPPER_BIN_DIR/sdkmanager" ) prev="" update_all=1 for arg in "$@"; do if [[ $arg == --use-sdk-wrapper || $arg == $verb || $arg == $object ]]; then continue elif [[ $arg == -n ]]; then echo "update sdk -n is not supported" exit 2 elif [[ $arg == -s || $arg == --no-https ]]; then command+=("--no_https") elif [[ $arg == -a || $arg == --all ]]; then command+=("--include_obsolete") elif [[ $arg == -p || $arg == --obsolete || $arg == -u || $arg == --no-ui || $arg == --proxy-host || $arg == --proxy-port || $arg == -t || $arg == --filter ]]; then : elif [[ $prev == --proxy-host ]]; then command+=("--proxy=http" "--proxy_host=$arg") elif [[ $prev == --proxy-port ]]; then command+=("--proxy_port=$arg") elif [[ $prev == -t || $prev == --filter ]]; then update_all= parse_filter $arg else echo Unrecognized argument $arg exit 2 fi prev=$arg done if [[ -n $update_all ]]; then command+=("--update") fi echo_and_exec ${command[@]} fi fi usage $@

3
задан 1 June 2017 в 02:41

3 ответа

Как показано вашим изображением, имя файла просто android, поэтому любая попытка запустить его с использованием имени android.sh не будет работать.

Ваша попытка запустить его с помощью sh также обречен, потому что sh не bash. Это применяется независимо от строки #! или интерактивной оболочки $0, из которой вы ее запускаете. (В частности, dash не поддерживает такие вещи, как замещение процесса - возможно, причина сообщений Syntax error: redirection unexpected.)

Самый простой способ выполнить его с терминала - это сначала убедиться, что выполнение бит

chmod +x android

, а затем запустить его с помощью

./android

./ необходимо сообщить оболочке, где искать файл (т. е. текущий каталог ). Вы можете использовать bash android явно, но лучше использовать хеш-банд, чтобы определить, какой интерпретатор использовать.

0
ответ дан 22 May 2018 в 22:01

Как показано вашим изображением, имя файла просто android, поэтому любая попытка запустить его с использованием имени android.sh не будет работать.

Ваша попытка запустить его с помощью sh также обречен, потому что sh не bash. Это применяется независимо от строки #! или интерактивной оболочки $0, из которой вы ее запускаете. (В частности, dash не поддерживает такие вещи, как замещение процесса - возможно, причина сообщений Syntax error: redirection unexpected.)

Самый простой способ выполнить его с терминала - это сначала убедиться, что выполнение бит

chmod +x android

, а затем запустить его с помощью

./android

./ необходимо сообщить оболочке, где искать файл (т. е. текущий каталог ). Вы можете использовать bash android явно, но лучше использовать хеш-банд, чтобы определить, какой интерпретатор использовать.

0
ответ дан 18 July 2018 в 12:24

Как показано вашим изображением, имя файла просто android, поэтому любая попытка запустить его с использованием имени android.sh не будет работать.

Ваша попытка запустить его с помощью sh также обречен, потому что sh не bash. Это применяется независимо от строки #! или интерактивной оболочки $0, из которой вы ее запускаете. (В частности, dash не поддерживает такие вещи, как замещение процесса - возможно, причина сообщений Syntax error: redirection unexpected.)

Самый простой способ выполнить его с терминала - это сначала убедиться, что выполнение бит

chmod +x android

, а затем запустить его с помощью

./android

./ необходимо сообщить оболочке, где искать файл (т. е. текущий каталог ). Вы можете использовать bash android явно, но лучше использовать хеш-банд, чтобы определить, какой интерпретатор использовать.

0
ответ дан 24 July 2018 в 19:57

Другие вопросы по тегам:

Похожие вопросы: