Créer un processus d’arrière-plan dans une fonction bash

Je travaille sur l’écriture d’une fonction Bash pour démarrer un serveur qui doit être démarré à partir d’un certain dossier, mais je ne souhaite pas que le démarrage de ce serveur ait un impact sur mon travail actuel. J’ai écrit ce qui suit:

function startsrv { pushd . cd ${TRUNK} ${SERVERCOMMAND} & popd } 

Mes variables sont toutes définies, mais lorsqu’elles s’exécutent, j’obtiens une erreur concernant un point-virgule inattendu dans la sortie, il semble que Bash insère un point-virgule après l’esperluette commençant ${SERVERCOMMAND} en arrière-plan.

Y a-t-il quelque chose que je puisse faire pour démarrer ${SERVERCOMMAND} en arrière-plan tout en utilisant pushd et popd pour m’assurer de me retrouver dans mon répertoire actuel?

Edit: Sortie de echo ${SERVERCOMMAND} , car il a été demandé:

 yeti --server --port 8727 

Message d’erreur:

 -bash: syntax error near unexpected token `;' 

Quelle est la valeur de $SERVERCOMMAND ? Vous devez avoir un point-virgule dedans.

Pour ce que cela vaut la peine, vous pouvez simplifier le pushd / cd à un pushd:

 pushd $TRUNK $SERVERCOMMAND & popd 

Ou créez un sous-shell pour que le CD n’affecte que la commande:

 (cd $TRUNK; $SERVERCOMMAND &) 

Vous pouvez aussi utiliser cd -

 cd $TRUNK $SERVERCOMMAND & cd - 

Un point-virgule dans ${SERVERCOMMAND} ne doit pas déclencher d’erreur de syntaxe, à moins qu’il y ait un bogue dans bash lui-même. Le problème de point-virgule doit être situé ailleurs, dans une partie du code que nous ne voyons pas.

Outre le point-virgule, votre code contient quelques bogues mineurs:

  • L’expansion de la variable ${TRUNK} n’est pas citée. Si le nom du répertoire contient des espaces, bash le divisera en plusieurs champs avant d’appeler cd .
  • La valeur de retour de cd ${TRUNK} n’est pas cochée. Si le répertoire n’existe pas, bash appellera le serveur dans le répertoire en cours.
  • La fonction ne teste pas si ${SERVERCOMMAND} peut ne pas s’exécuter (par exemple, la commande est introuvable).
  • Le mot-clé function et les commandes pushd et popd étant spécifiques à bash , ce code ne fonctionnera pas dans un shell POSIX.

Voici une réécriture plus sûre, compatible avec POSIX:

 log() { printf '%s\n' "$*"; } error() { log "ERROR: $*" >&2; } fatal() { error "$*"; exit 1; } startsrv() { ( cd "${TRUNK}" || fatal "failed to cd to '${TRUNK}'" set -- ${SERVERCOMMAND} command -v "$1" >/dev/null || fatal "command '$1' not found" command "$@" & ) || exit 1 }