Чи можна дізнатися, чи файл вже був виправлений, перш ніж застосувати патч?
Мені потрібно це робити за сценарієм, будь-якими думками?
Чи можна дізнатися, чи файл вже був виправлений, перш ніж застосувати патч?
Мені потрібно це робити за сценарієм, будь-якими думками?
Відповіді:
Так, просто запустіть patchз --dry-runваріантом, він або не вдасться, або досягне успіху, що можна дізнатися зі статусом виходу.
Але в більш поширеному (і схильному до помилок) способі , ймовірно, вам доведеться запустити його з -Rопцією, що означає "зворотний", оскільки лише в тому випадку, якщо він зміг відновити весь патч, його можна вважати "застосованим". В іншому випадку (без '-R') він може вийти з ладу лише через те, що деякі частини оригінального файлу були змінені. Нижче наведено простий приклад:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Evenmore, в фрагменті вище ви могли б навіть вважав за краще , щоб змусити замовкнути patchповністю перенаправляє його стандартний висновок і стандартний потік помилок в /dev/null)
-sfдо patch(можна записати як patch -Rsfp0 --dry-run)
На всякий випадок, коли це комусь допомагає, якщо ви використовуєте bash script, то приклад, поданий Omnifarious, не працював. У bash статус виходу успішної команди дорівнює 0
Отже, працює так:
patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
#apply the patch
patch -p0 -N < patchfile
fi
1замість 0:if [ $? -eq 1 ]
trueдля цілей if. Саме тому, що більшість команд використовують вихідний код 0 для позначення успіху.
Ось здогадка, припускаючи, що ви використовуєте patchутиліту і кожен файл, який потрібно виправити, має свій власний патч:
if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
echo The file has not had the patch applied,
echo and the patch will apply cleanly.
else
echo The file may not have had the patch applied.
echo Or maybe the patch doesn't apply to the file.
fi
-Bможливістю, що призведе до створення резервної копії. Потім ви перевіряєте наявність резервної копії.
nohupв такому ifвипадку?
У моєму випадку я хотів зробити цю перевірку, щоб виконання команди патча не закінчилось інтерактивним терміналом із запитом, що робити (особливо для CI).
Виявляється, що якщо вам лише потрібно, ви можете також використовувати --forwardаргумент, і він пропустить патч, якщо він уже застосований!