Создайте фоновый процесс в функции bash - PullRequest
3 голосов
/ 10 июня 2011

Я работаю над написанием функции Bash для запуска сервера, который должен быть запущен из определенной папки, но я не хочу, чтобы запуск этого сервера влиял на мою текущую работу.Я написал следующее:

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

Все мои переменные установлены, но когда это выполняется, я получаю ошибку, связанную с неожиданной точкой с запятой в выходных данных, и кажется, что Bash вставляет точку с запятой после амперсанданачиная с ${SERVERCOMMAND} в фоновом режиме.

Есть ли что-нибудь, что я могу сделать, чтобы запустить ${SERVERCOMMAND} в фоновом режиме, все еще используя pushd и popd, чтобы убедиться, что я снова оказался в моем текущем каталоге?

Редактировать: вывод echo ${SERVERCOMMAND}, поскольку он был запрошен:

yeti --server --port 8727

Сообщение об ошибке:

-bash: syntax error near unexpected token `;'

Ответы [ 3 ]

11 голосов
/ 10 июня 2011

Какое значение $SERVERCOMMAND?У вас должна быть точка с запятой.

Для чего бы то ни было, вы можете упростить pushd / cd до одного pushd:

pushd $TRUNK
$SERVERCOMMAND &
popd

Или создать подоболочку, чтобы компакт-диск влиял только наодна команда:

(cd $TRUNK; $SERVERCOMMAND &)
3 голосов
/ 10 июня 2011

Вы также можете использовать cd -

cd $TRUNK
$SERVERCOMMAND &
cd -
2 голосов
/ 10 июня 2011

Точка с запятой в ${SERVERCOMMAND} не должна вызывать синтаксическую ошибку, если только в самой bash нет ошибки. Проблема с точкой с запятой должна находиться в другом месте, в той части кода, которую мы не видим.

Помимо проблемы с точкой с запятой, в вашем коде есть незначительные ошибки:

  • Расширение переменной ${TRUNK} не заключено в кавычки. Если имя каталога содержит пробелы, bash разделит его на несколько полей перед вызовом cd.
  • Возвращаемое значение cd ${TRUNK} не проверяется. Если каталог не существует, bash вызовет сервер в текущем каталоге.
  • Функция не проверяет, может ли ${SERVERCOMMAND} не выполняться (например, команда не найдена).
  • Ключевое слово function и команды pushd и popd зависят от bash, поэтому этот код не будет работать в оболочке POSIX.

Вот более безопасное, 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
}
...