Mam skrypt bash dla linuksa, który ma parametr do aktualizacji samego skryptu. Moim problemem jest to, że skrypt nie może się aktualizować, gdy jest używany. Cóż .. Czy ktoś ma rozwiązanie?
Obecnie próbuję zaktualizować skrypt w następujący sposób:
# Download latest version
wget -q https://github.com/TS3Tools/TS3UpdateScript/archive/master.zip
# Unzip latest version
unzip master.zip TS3UpdateScript-master/* -x TS3UpdateScript-master/configs/ && mv -f TS3UpdateScript-master/* . && rmdir TS3UpdateScript-master/
Ale skrypt otrzymuje następujący błąd:
replace TS3UpdateScript-master/LICENSE_GNU_GPL.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
ateScript-master/configs
caution: excluded filename not matched: TS3UpdateScript-master/configs/
# many arguments
Mam nadzieję, że ktoś może mi pomóc. Z góry dziękuję!
Odpowiedzi:
1 dla odpowiedzi № 1Wygląda na to, że Twój błąd pochodzi z wieloznacznej nazwy pliku bez cudzysłowów. Bash najpierw robi globbing i zastępuje *
z dużą ilością nazw plików, a następnie uruchamia się rozpakować z tymi parametrami. Próbować master.zip "TS3UpdateScript-master/*" -x "TS3UpdateScript-master/configs/"
.
Wtedy wystąpi problem z uruchomieniem nowej wersji skryptu zamiast starej działającej. Myślę, że powinno to być zrobione w ten sposób:
#!/bin/bash
version=4
if [ "$UPDATED" != "$0" ]; then
cp self_update.new.sh self_update.sh
exec env UPDATED="$0" "$0" "$@"
fi
echo "This script"s version is $version"
0 dla odpowiedzi nr 2
Dzięki za pomoc i pomysły! "Przekazałem" kod do innego skryptu, który zawiera następujący kod:
#!/usr/bin/env bash
sleep 5s
# Download latest version
wget -q https://github.com/TS3Tools/TS3UpdateScript/archive/master.zip
# Unzip latest version
if [[ $(unzip master.zip TS3UpdateScript-master/* -x TS3UpdateScript-master/configs/*) ]]; then
if [ $(cp -Rf TS3UpdateScript-master/* . && rm -rf TS3UpdateScript-master/) ]; then
rm -rf master.zip
exit 1;
fi
else
rm -rf master.zip
exit 0;
fi