Преобразование цикла в однострочную команду для повышения производительности сценария оболочки в HP -UX

«Заплатка» — это файл, описывающий изменения в другом файле (файл может быть любым, включая исходный код ). Один из самых простых способов создания и использования патча — это 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 .

В этом выступлении разработчика Linux Грега Кроа в 2016 г. -Хартман дает обзор того, на что похожа разработка Linux

0
01.07.2020, 12:06
1 ответ
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....

5
18.03.2021, 23:22

Теги

Похожие вопросы