Grepping переменная

Патчи обычно содержатся в .diff файлы, потому что патчи создаются с помощью diff команда.

Патч является серией вставок и удалений в исходный код. Поэтому для использования патча, необходимо создать приложение (например, "foobar") из источника после применения патча. Так, на шагах:

1. Получите исходный пакет для foobar.

Большинство дистрибутивов Linux (n.b. исправление не уникально для Linux) имеет "исходные пакеты", можно использовать с этой целью, но так как они неоднородны, я только обращусь к формату первоисточника здесь. Первоисточник не является частью дистрибутива и может быть тверд найти. Хорошим местом для запуска является Википедия, которая имеет статьи для многих распространенных приложений, и статья должна содержать ссылку на домашнюю страницу с исходной загрузкой. Можно также погуглить себя, очевидно. Исходный пакет назовут чем-то как foobar.0.1.tar.bz2. Распакуйте это - Вам теперь назвали каталог foobar.0.1.

2. Добавьте патч.

Иногда патчи являются единственными файлами, и иногда они - ряд нескольких файлов. Скопируйте тех, которые в foobar.0.1 и cd foobar.0.1. Затем, необходимо работать patch команда. Это читает из стандартного входа, таким образом, Вы хотите передать по каналу .diff файл в. Хитрая часть определяет, что использовать для -p опция (при отсутствии инструкций с патчем). Чтобы сделать это, необходимо посмотреть в начале файла исправления. Например:

--- old/comm.c  2003-09-08 14:25:08.000000000 +0000
+++ new/comm.c  2006-07-07 02:39:24.000000000 +0000

В этом случае, comm.c название исходного файла, который будет изменен. Однако заметьте, что существует каталог, добавленный к нему. Так как это не тот же каталог ("старый" по сравнению с "новым"), это - большая подсказка, что эта часть пути является спамом (в наших целях). Цель -p переключатель (см. man patch) должен устранить этот префикс. Это берет число, которое является количеством наклонных черт (/) устранить, со всем промежуточным; в этом случае мы использовали бы -p1 уменьшать путь только к comm.c.

Это предполагает comm.c находится на самом деле в том же каталоге, который будет другой подсказкой относительно того, корректна ли Ваша интерпретация. Если обе тех строки были src/comm.c, и comm.c находится на самом деле в src подкаталог Вашего дерева сборки, затем необходимо использовать -p0 - остерегайтесь этого не использование -p вообще удалит ВСЕ наклонные черты. Если путь является полным (т.е. начинается /), это, вероятно, что Вы хотите. Теперь примените патч:

patch -p1 < patch.diff

Источник был теперь изменен. Если существует больше .diff файлы, примените их тот же путь.

3. Сборка и установка.

Это - нормальный процесс, Вы пошли бы до сборки что-то из источника - сначала ./configure, затем make, make check, make install. Прежде чем Вы сделаете последний, если у Вас уже есть существующая установка foobar, решите, хотите ли Вы удалить или перезаписать это или как Вы собираетесь иметь дело с конфликтом имен. Вы, вероятно, хотите foobar относиться к Вашей новой, исправленной версии а не старой.

3
18.11.2018, 19:18
1 ответ

Возможно, я что-то упускаю, но я не понимаю, зачем вы вообще возитесь с grep . Для этого предназначен pgrep :

#!/bin/sh
# chkconfig: 123456 90 10

workdir=/usr/local/bin/Foo

start() {
    cd $workdir
    /usr/bin/python26 $workdir/Bar.py &
    echo "FooBar started."
}

stop() {
    pid=`pgrep -f '/Bar.py$'`
    echo $pid
    kill $pid
    sleep 2
    echo "FooBar stopped."
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: /etc/init.d/foobar {start|stop|restart}"
    exit 1
esac
exit 0

Команда pgrep предназначена для возврата PID процессов, имена которых соответствуют заданному шаблону. Поскольку это сценарий Python, фактический процесс выглядит примерно так:

python /usr/local/bin/Bar.py

Где имя процесса - python . Итак, нам нужно использовать флаг pgrep -f , чтобы сопоставить полное имя:

   -f, --full
          The pattern is normally only matched against the  process  name.
          When -f is set, the full command line is used.

Чтобы убедиться, что это не соответствует таким вещам, как fooBar.py , шаблон /Bar.py$ , чтобы он соответствовал только части после последнего / и в конце строки ( $ ).

На будущее: никогда не используйте ps | grep , чтобы получить PID. Это всегда будет возвращать как минимум две строки, одну для запущенного процесса и одну для только что запущенного grep:

$ ps -ef | grep 'Bar.py'
terdon   27209  2006 19 17:05 pts/9    00:00:00 python /usr/local/bin/Bar.py
terdon   27254  1377  0 17:05 pts/6    00:00:00 grep --color Bar.py
3
27.01.2020, 21:23

Теги

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