Verificando a instalação do programa e continuando script

0

Eu tenho este script que (eu acho) verifica a existência de alguns programas e pacotes npm e continua fazendo coisas:

#!/bin/bash

# Functions ==============================================

function programa_instalado {
  # set to 1 initially
  local return_=1
  # set to 0 if not found
  type $1 >/dev/null 2>&1 || { local return_=0; }
  # return value
  echo "$return_"
}

function paquete_npm_instalado {
  # set to 1 initially
  local return_=1
  # set to 0 if not found
  ls node_modules | grep $1 >/dev/null 2>&1 || { local return_=0; }
  # return value
  echo "$return_"
}

function pregunta_node {
  if [ $1 == 1 ]; then
    $(echo "Node ya instalado")
  else
    $(curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -)
    $(sudo apt-get install -y nodejs)
    $(sudo apt-get install -y build-essential)
  fi
}

function pregunta_pyinstaller {
  if [ $1 == 1 ]; then
    $(echo "Pyinstaller ya instalado")
  else
    $(pip install pyinstaller)
  fi
}
function pregunta_zerorpc {
  if [ $1 == 1 ]; then
    $(echo "Zerorpc ya instalado")
  else
    $(pip install zerorpc)
  fi
}

# ============================================== Functions

# command line programs
$(pregunta_node $(programa_instalado node))
$(pregunta_zerorpc $(paquete_npm_instalado zerorpc))
$(pregunta_pyinstaler $(paquete_npm_instalado pyinstaller))
$(git clone some_url)
$(cd folder)
$(npm install --runtime=electron --target=1.7.9)
$(pyinstaller server.py --distpath dist ; rm -rf build/ ; rm -rf server.spec)
$(./node_modules/.bin/electron-packager . --overwrite)

O problema é que a execução fica para sempre. Eu não sei o que poderia estar errado

    
por user3754696 03.12.2017 / 21:05

1 resposta

0

A substituição do comando $(...) executa o comando dentro dos parênteses e coloca a saída de volta na linha de comando (bem, mais ou menos, veja em particular aqui se você realmente precisar dele.)

Eles fazem a mesma coisa:

ls $(echo /bin)
ls /bin

Na maioria dos casos, você não quer executar uma substituição de comando sozinho em uma linha de comando, mas apenas executar os comandos normalmente (como você fez com ls node_modules | grep ... ). Isso também é o mesmo que os anteriores, mas é estranho:

$(echo ls /bin)

Em particular, $(cd somedir) não faz nada de útil, já que a substituição de comandos é executada em um subshell, então mudar o diretório não afeta o shell principal.

Isto:

$(pregunta $(programa_instalado node))

Primeiro, chama a função programa_instalado , que gera (digamos) 1 . Então o shell tenta executar o comando pregunta 1 , mas a julgar pelo erro, não há comando com esse nome. Se houvesse, sua saída também seria executada como um comando .

O mesmo vale para git e npm , ou você realmente não tem aqueles instalados, ou deve verificar se seu PATH é são.

    
por 03.12.2017 / 21:11