Não é possível executar o script (é executável, o hash bang corresponde ao shell)

3

Eu cortei a questão para facilitar a leitura, embora possa parecer um pouco difícil

PROBLEMA: Não é possível executar um script bash a partir do que acredito ser um shell bash.

FUNDO: Estou tentando começar com o LibGDX, e eles querem que eu instale o Android SDK como parte do trabalho no Eclipse. Como tal, eu tenho este script que deveria instalar tudo o que eu baixei.

ESPECIFICAÇÕES: Fator de forma pequeno HP Compaq dc7900 Memória: 3.8 GiB Gráficos: Gálio 0,4 no AMD RV620 (DRM 2.46.0 / 4.8.0-52-genérico, LLVM 3.8.0)

Processador: CPU Intel® Core ™ 2 Duo E8400 @ 3.00GHz × 2

SO: Ubuntu 16.04 64 bit

Revisão do Android SDK 26.0.2 (abril de 2017) link

HISTÓRIA DO PROBLEMA

Permissões alteradas para executáveis para leitura / gravação para todos

As permissões são definidas como na imagem

Hash bang line, de acordo com a saída do comando head

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

Saída da verificação do shell

$ echo $0
/bin/bash

O terminal foi aberto na mesma pasta que o script de destino e tentou os seguintes comandos, com a saída diretamente abaixo dele.

$ 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

Eu também tentei prefixar ~ / e ./ e eles não têm efeito; o único padrão é que incluindo a extensão de nome de arquivo "não pode abrir", enquanto omitindo ele dá "redirecionamento inesperado"

Curiosamente, eu tentei abrir um arquivo inexistente eirugheur.sh, e ele deu o mesmo tipo de erros.

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

Então, não tenho como saber se "Não é possível abrir" significa que o arquivo está faltando ou se estou brincando com os comandos.

Obrigado por ler, sugestões ou soluções alternativas são bem-vindas.

EDIT: saída de 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$

Atualmente estou lendo o link do steeldriver

EDIT: ./android

do driver de aço testado

Saída:

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

Aqui está o script, a solução da steeldriver funcionou, já que essa mensagem de erro vem do script. Obrigado pela sua ajuda, suponho que vou começar a trabalhar para descobrir o próximo passo. > >

#!/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 $@
    
por Joel Nash 31.05.2017 / 21:55

1 resposta

0

Como mostrado pela sua imagem, o nome do arquivo é simplesmente android - portanto, qualquer tentativa de executá-lo usando o nome android.sh não funcionará.

Sua tentativa de executá-lo com sh também está condenada porque sh não é bash . Isso se aplica independentemente da linha #! ou do shell interativo $0 a partir do qual você a executa. (Em particular, dash não suporta coisas como substituição de processos - provavelmente a causa das mensagens Syntax error: redirection unexpected .)

A maneira mais simples de executá-lo a partir do terminal é primeiro para garantir que o bit de execução esteja definido:

chmod +x android

e depois executá-lo usando

./android

O ./ é necessário para informar ao shell onde procurar pelo arquivo (ou seja, seu diretório atual). Você poderia usar bash android explicitamente, mas é melhor praticar o hashbang para determinar qual interpretador usar.

    
por steeldriver 31.05.2017 / 22:23