Можно, конечно, изменить функцию демона для установки группы, или можно записать собственное mydaemon
функция, чтобы сделать это.
Или самым простым способом просто звонят runuser
управляйте этим daemon()
использование для запуска программы с деталью UID
и GID
Обычно это можно обойти, используя параметр -l
:
используйте параметр -l или --ignore-whitespace, который позволяет патчу сравнивать пустые символы (т.е. пробелы и табуляции), так что любая непустая последовательность пробелов в файл патча соответствует любой непустой последовательности пробелов во входных файлах
Это стандартная функция (см. описание POSIX patch ).
Однако OP изменил вопрос, чтобы прокомментировать Как преобразования окончания строки работают с ядром git.autocrlf между различными операционными системами и добавил пример, намекающий, что проблема наблюдается с файлами в Windows (в отличие от примера в стиле Unix). Хотя патч
пытается устранить несоответствия между окончаниями строк CRLF и LF, он склонен предполагать, что используется последнее. Если файл исправления имеет окончания CRLF, а файлы для исправления - нет, он будет восстанавливаться, как в этом примере журнала:
(Stripping trailing CRs from patch.)
patching file xterm.log.html
(Stripping trailing CRs from patch.)
patching file xterm.man
(Stripping trailing CRs from patch.)
patching file xtermcfg.hin
Проверка исходного кода, в аналогичной
функции, GNU patch
обрабатывает пробелы как пробелы и табуляцию с некоторой специальной обработкой в зависимости от того, имеют ли строки завершающий LF. CR не упоминается. Он обращает внимание на check_line_endings
, но использует эту информацию только как часть сообщения, чтобы помочь диагностировать отклонение. Он удаляет завершающие CR в pget_line , если не задана опция - binary
.
У патча GNU нет возможности указать ему преобразовать патч с окончанием LF в CRLF для применения к файлам, концы строк которых являются CRLF. Чтобы использовать его надежно в этом случае, можно выбрать
- binary
. . У меня была та же проблема с использованием команды patch
, которая поставляется с MSYS2 в Windows. В моем случае и исходный файл, и патч имели окончание строки CRLF, и преобразование обоих в LF тоже не сработало. Сработало следующее:
$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...
патч
преобразует концы строк в LF во всех исправленных файлах, поэтому необходимо преобразовать их обратно в CRLF.
Замечания: я использую патч
, версия 2.7.5
У меня была похожая проблема на Cygwin. В моем случае исправление заключалось в использовании флага -i
вместо чтения со стандартного ввода.
Не удалось выполнить следующее: разные окончания строк ошибка:
patch -t -N -r - -p0 < patchfile
Но удалось следующее:
patch -t -N -r - -p0 -i patchfile
Я не уверен в причине, но оставлю это здесь на случай, если у кого-то возникнет такая же проблема.
В моем случае оказалось, что patch
был вызван из установки Strawberry Perl на этой машине, которая появилась первой в %PATH%
(, а патч вообще не был установлен в Cygwin ).
Таким образом, я попытался применить исправление с другим двоичным файлом исправления, а не с тем, с которым оно было создано.
Я установил patch
в Cygwin и вызвал явно/usr/bin/patch
-сработало.
Я испробовал все решения, но по какой-то причине они не помогли. Вместо этого я сделал обратное, изменив окончания строк в файле, который я пытался исправить, исправив, а затем снова изменив окончания строк в файле, который я исправил.
dos2unix <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
unix2dos <file I was trying to patch>
В зависимости от вашей ситуации вам может потребоваться сделать противоположное:
unix2dos <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
dos2unix <file I was trying to patch>