Обновление запущенного файла Bash - PullRequest
1 голос
/ 17 апреля 2019

У меня есть следующая функция в скрипте bash. Давайте назовем этот скрипт example.sh. Он находится внутри репозитория git, который должен обновиться.

example.sh (упрощенная версия)

# Directory of script
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

update() {
  ( cd "$dir" && git pull )
}

if [ "$1" == "update" ]; then
  update
fi

Затем я вызываю example.sh update (который вызывает функцию), чтобы он выполнял git pull.

Теперь проблема в том, что в example.sh есть изменение, оно должно само обновляться. У Linux нет проблем с этим, но GitBash (Windows ..) жалуется, говоря:

ошибка: невозможно создать файл example.sh: разрешение запрещено

вероятно, потому что он используется для того, чтобы все еще запускать example.sh update и ожидать завершения git pull.

Я уже пробовал

( cd "$dir" && git pull & )

и

bash -c "sleep 1 && cd \"$dir\" && git pull" &

Как запустить новый процесс для обновления этого репо, чтобы в момент git pull ing не использовались файлы?

1 Ответ

0 голосов
/ 17 апреля 2019

Из-за отсутствия GitBash для Windows я не смог протестировать следующее предложение.Я был бы рад, если бы вы могли дать мне некоторую обратную связь.

В начале вашего сценария добавьте

#! /bin/bash

self="$(sed '0,/^# ACTUALSCRIPT/d' "$BASH_SOURCE")"
exec bash -c "$self" "$0" "$@"
# ACTUALSCRIPT (keep this comment, the script relies on it)

# your old script
# ...

Это заменит процесс сценария новым процессом bash, который читаеткоманды из его аргументов, а не из файла.

Обратите внимание, что обнаружение каталога скрипта, вероятно, не будет работать внутри bash -c.При необходимости вы можете передать каталог в качестве аргумента.Кроме того, вы можете cd до exec, чтобы новый процесс запускался в правильном каталоге.

...