Во-первых, вы не цитируете свои переменные.Во-вторых, -ne
для сравнения чисел, а не строк.Вместо этого используйте !=
:
if [ "$newsum" != "$checksum" ]
Как отметил Эд Хил в своем комментарии, алгоритм, возможно, имеет смысл, только если файл модифицируется атомарно.Лучший способ гарантировать это, если он генерируется в одном месте, а затем перемещается в kinect.tar
.Кроме того, если файл был изменен во время сборки предыдущей версии, ваш код не будет перехватывать это изменение, которое может быть исправлено следующим изменением, предложенным Эд Хилом:
checksum=`md5sum kinect.tar`
while [ 1 ]
do
sleep 10
old_checksum=$checksum
checksum=`md5sum kinect.tar`
if [ "$old_checksum" != "$checksum" ]
Действительно, это будетлучше всего, если бы у вас был лучший способ для процесса написания файла .tar
для связи с вашим сценарием.Например, новые .tar
файлы всегда полностью записываются, а затем перемещаются в kinect-new.tar
, который проверяется сценарием и перемещается в kinect.tar
.Это исключает как возможность чтения неполного файла, так и беспорядок сравнения md5sums.(Вы можете быть хитрее и использовать что-то вроде inotify-tools , чтобы избежать явного опроса, но это, возможно, не стоит усилий.)
К сожалению, это не решает проблему, связанную с тем, чтосборка может завершиться неудачно (если используемые вами .tar
файлы не являются известными исправными выпусками, и в этом случае маловероятно, что вы захотите проверять наличие нового каждые 10 секунд).Возможно, вы захотите создать каталог, распаковать его и заменить старую версию только в случае успеха make
.Что-то вроде этого:
tar -zxf kinect.tar
cd kinect
if make
then
cd ..
rm -rf kinect.good
mv kinect kinect.good
cd kinect.good
killall lebron
./lebron &
fi
cd .. # make sure we always stay in the original directory