Можно ли узнать, был ли файл уже исправлен, прежде чем применять исправление?
Мне нужно сделать это в сценарии, какие-нибудь мысли?
Можно ли узнать, был ли файл уже исправлен, прежде чем применять исправление?
Мне нужно сделать это в сценарии, какие-нибудь мысли?
Ответы:
Да, просто запустите patch
с --dry-run
параметром, он либо потерпит неудачу, либо преуспеет, что можно узнать по состоянию выхода.
Но в более распространенном (и подверженном ошибкам) способе вам, вероятно, придется запускать его с -R
опцией, которая означает «обратный», поскольку только в том случае, если он способен отменить весь патч, его можно рассматривать как «примененный». В противном случае (без '-R') он может потерпеть неудачу только из-за того, что некоторые части исходного файла были изменены. Ниже приведен простой пример:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Более того, в приведенном выше фрагменте вы можете даже предпочесть patch
полностью замолчать, перенаправив его stdout и stderr на /dev/null
)
-sf
к patch
(можно записать в виде patch -Rsfp0 --dry-run
)
На всякий случай, если кому-то это поможет, если вы используете bash-скрипт, пример, приведенный Omnifarious, не сработает. В bash статус выхода успешной команды равен 0
Таким образом, будет работать следующее:
patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
#apply the patch
patch -p0 -N < patchfile
fi
1
вместо 0
:if [ $? -eq 1 ]
true
для целей if. Именно потому, что большинство команд используют код выхода 0, чтобы обозначить успех.
Вот предположение, предполагающее, что вы используете patch
утилиту, и у каждого файла, который должен быть исправлен, есть собственный патч:
if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
echo The file has not had the patch applied,
echo and the patch will apply cleanly.
else
echo The file may not have had the patch applied.
echo Or maybe the patch doesn't apply to the file.
fi
-B
параметром, который приведет к созданию резервной копии. Затем вы проверяете наличие резервной копии.
nohup
в этом if
случае?
В моем случае я хотел сделать эту проверку, чтобы выполнение команды patch не заканчивалось интерактивным терминалом, спрашивающим, что делать (особенно для CI).
Оказывается, что если вам нужно только это, вы также можете использовать --forward
аргумент, и он пропустит патч, если он уже был применен!