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:
${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
. cd ${TRUNK}
n’est pas cochée. Si le répertoire n’existe pas, bash
appellera le serveur dans le répertoire en cours. ${SERVERCOMMAND}
peut ne pas s’exécuter (par exemple, la commande est introuvable). 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 }