Чи можна дізнатися, чи файл вже був виправлений, перш ніж застосувати патч?
Мені потрібно це робити за сценарієм, будь-якими думками?
Чи можна дізнатися, чи файл вже був виправлений, перш ніж застосувати патч?
Мені потрібно це робити за сценарієм, будь-якими думками?
Відповіді:
Так, просто запустіть 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
аргумент, і він пропустить патч, якщо він уже застосований!