Невозможно применить унифицированное исправление diff на Solaris
Например, если у меня есть два файла:
file1:
This is file 1
и файл2:
This is file 2
и создайте патч с помощью следующей команды:
diff -u file1 file2 > files.patch
результат:
--- file1 Fri Aug 13 17:53:28 2010
+++ file2 Fri Aug 13 17:53:38 2010
@@ -1,1 +1,1 @@
-This is file 1
+This is file 2
Затем, если я попытаюсь применить этот патч на Solaris с помощью команды patch:
patch -u -i files.patch
это висит на:
Looks like a unified context diff.
File to patch:
1. Есть ли способ использовать встроенную команду исправлений Solaris с унифицированными различиями?
2. Какой формат diff считается наиболее переносимым, если невозможно применить унифицированный формат?
Обновление: я нашел ответ на первую часть моего вопроса. Кажется, что patch
на Solaris зависает, если второй файл (в данном случае file2) существует в той же папке, что и первый (file1). Например, следующий довольно распространенный diff:
--- a/src/file.src Sat Aug 14 23:07:29 2010
+++ b/src/file.src Sat Aug 14 23:07:37 2010
@@ -1,2 +1,1 @@
-1
-
+2
не будет работать с довольно распространенной командой:
patch -p1 -u -d a < file.patch
в то время как следующий diff (примечание, второй файл переименован):
--- a/src/file.src Sat Aug 14 23:07:29 2010
+++ b/src/file_new.src Sat Aug 14 23:07:37 2010
@@ -1,2 +1,1 @@
-1
-
+2
будет работать отлично.
Для второй части моего вопроса см. Принятый ответ ниже.
3 ответа
Single Unix v2 и v3 поддерживают контекстные различия, но не унифицированные, поэтому для лучшей переносимости следует использовать контекстные различия (-c
возможность diff
а также patch
).
В старых версиях Solaris (я думаю, до 10) вам необходимо убедиться, что /usr/xpg4/bin
раньше /usr/bin
в вашем $PATH
в противном случае вы можете получить версии совместимости некоторых утилит вместо стандартных.
На солярисе /usr/bin/patch
это старая версия, необходимая для соответствия некоторым древним стандартам. Современная версия патча GNU предоставляется в виде /usr/bin/gpatch
на солярисе 8 и позже.
diff -cr old.new new.txt > patch.txt
gpatch -p0 < patch.txt
У меня отлично работает (с помощью gpatch)