プログラムのインストールを確認してスクリプトを続行する

プログラムのインストールを確認してスクリプトを続行する

私は(私の考えでは)特定のプログラムとnpmパッケージの存在を確認し、それを実行する次のスクリプトを持っています。

#!/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)

問題は、実行が永久に中断されることです。何が間違っているのかわかりません。

答え1

コマンド置換は$(...)括弧内に与えられたコマンドを実行し、出力をコマンドラインに戻します。(まあ、特に見るとここ本当に必要な場合。 )

これらは同じことを行います。

ls $(echo /bin)
ls /bin

ほとんどの場合、コマンドラインで個別にコマンド置換を実行せずにコマンドラインで行ったように、通常どおりコマンドを実行しますls node_modules | grep ...。以前と同じですが変です。

$(echo ls /bin)

特に、$(cd somedir)コマンドの置換はサブシェルで実行されるため、役に立つ作業を行わないため、ディレクトリを変更してもメインシェルには影響しません。

これ:

$(pregunta $(programa_instalado node))

まず、出力する関数がprograma_instalado呼び出されます1。その後、シェルはコマンドを実行しようとしますpregunta 1が、エラーと判断した場合、その名前のコマンドはありません。もしそうなら、出力はコマンドとしても実行されます。

git同様なので、 npm実際にこれらのデバイスがインストールされていないか、デバイスが正常であることをPATH確認する必要があります。

関連情報