«Заплатка» — это файл, описывающий изменения в другом файле (файл может быть любым, включая исходный код ). Один из самых простых способов создания и использования патча — это diff
и patch
.
Допустим, у нас есть простая программа hello world в файле с именемhello1.c
:
#include
int main(void)
{
printf("Hello world!\n");
return 0;
}
Теперь изменим строку "Hello world!\n"
на "Hi world!\n"
и вызовем новую программуhello2.c
:
#include
int main(void)
{
printf("Hi world!\n");
return 0;
}
Теперь в терминале выполните следующую команду:
diff -u hello1.c hello2.c > hello-patch
Вывод содержимого файла исправления с помощью cat hello-patch
показывает это:
--- hello1.c 2019-03-18 13:29:35.897546888 -0500
+++ hello2.c 2019-03-18 13:30:02.866456737 -0500
@@ -2,6 +2,6 @@
int main(void)
{
- printf("Hello world!\n");
+ printf("Hi world!\n");
return 0;
}
В этом файле указаны различия между hello1.c
и hello2.c
.
Теперь предположим, что вы распространили исходный код hello1.c
среди своих друзей. Этот патч-файл hello-patch
позволяет вашим друзьям преобразовать hello1.c
в hello2.c
с помощью команды patch. Если hello1.c
и патч находятся в одном каталоге, эта команда:
patch < hello-patch
Это «применит патч к hello1.c
». Когда это будет сделано, hello1.c
будет обновлен и теперь идентичен hello2.c
.
Таким образом, патчи — это просто списки изменений в файле (или наборе файлов ), и эти патчи позволяют кому-то выборочно обновлять файл, применяя патчи.
Команды diff
и patch
хорошо работают для небольших патчей. Для всего большого и сложного потребуется инструмент промышленной прочности. Linux использует git
. Справочная система git
довольно хороша. Например, git help -a
перечисляет все git
разделы справки, а git help format-patch
подробно описывает, как «Подготовить исправления для электронной -отправки по почте».
Разработка Linux осуществляется по электронной почте, и вы можете просмотреть архив электронных писем, отправленных разработчиками Linux, на lkml.org и kernelnewbies.org — отличное место для начала. для изучения разработки ядра Linux. Имейте в виду, поскольку похоже, что книга, которую вы цитируете, была опубликована в 2009 году, некоторые содержащиеся в ней технические детали устарели.
«Перекомпиляция» в данном случае просто означает повторную компиляцию после применения патча к исходному коду. Это похоже на запуск чего-то вроде gcc hello1.c -o hello
для компиляции исходного файла в исполняемый код. В этом руководстве описывается сборка Linux .Здесь описывается процесс сборки с некоторыми шагами, которые можно использовать в дистрибутиве Debian .
while read line; do
bytes=` echo $line | wc -c `
done
Это, вероятно, медленная часть, вы запускаете внешнюю команду для каждой строки ввода.
В ksh вы можете просто использовать ${#line}
, чтобы получить длину строки в этой переменной. Однако обратите внимание, что если у вас есть многобайтовые символы, оболочка может считать по одному для каждого целого символа , в то время как wc -c
считает по одному для каждого байта . Добавьте LC_ALL=C
, чтобы сценарий использовал локаль C, что должно привести к подсчету всех отдельных байтов.
Однако оболочка, вероятно, не самый быстрый и лучший инструмент для этого. Если я правильно понял ваш сценарий, вы хотите удалить строки длиннее 3000 символов. Вы можете сделать это с помощьюgrep
(это должен быть стандартный BRE):
grep -e '^.\{0,300\}$' "$file"
или с помощью awk:
awk 'length <= 3000' "$file"
Точно так же использование локали C должно помочь здесь, если вместо этого вы хотите подсчитывать байты:LC_ALL=C awk...
.