Có thể biết nếu một tập tin đã được vá, trước khi áp dụng các bản vá?
Tôi cần phải làm điều này trong một kịch bản, bất kỳ suy nghĩ?
Có thể biết nếu một tập tin đã được vá, trước khi áp dụng các bản vá?
Tôi cần phải làm điều này trong một kịch bản, bất kỳ suy nghĩ?
Câu trả lời:
Đúng, chỉ cần chạy patch
với --dry-run
tùy chọn, nó sẽ thất bại hoặc thành công có thể được tìm thấy với trạng thái thoát của nó.
Nhưng theo cách phổ biến hơn (và dễ bị lỗi) , bạn có thể phải chạy nó với -R
tùy chọn có nghĩa là "đảo ngược" vì chỉ khi nó có thể hoàn nguyên toàn bộ bản vá thì nó mới có thể được coi là "áp dụng". Mặt khác (không có '-R'), nó có thể bị lỗi chỉ do một số phần của tệp gốc đã bị thay đổi. Dưới đây là một ví dụ đơn giản:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Hơn nữa, trong đoạn trích ở trên, bạn thậm chí có thể thích im lặng patch
hoàn toàn chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn của nó /dev/null
)
-sf
vào patch
(có thể được viết là patch -Rsfp0 --dry-run
)
Chỉ trong trường hợp nó giúp được ai đó, nếu bạn đang sử dụng tập lệnh bash thì ví dụ được đưa ra bởi Omnifarious sẽ không hoạt động. Trong bash trạng thái thoát của lệnh thành công là 0
Vì vậy, sau đây sẽ làm việc:
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
thay vì 0
:if [ $? -eq 1 ]
true
cho mục đích if. Chính xác bởi vì hầu hết các lệnh sử dụng mã thoát là 0 để biểu thị thành công.
Đây là một phỏng đoán, giả sử rằng bạn đang sử dụng patch
tiện ích và mỗi tệp được vá có bản vá riêng:
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
tùy chọn, điều này sẽ khiến việc sao lưu được thực hiện. Sau đó, bạn kiểm tra sự tồn tại của bản sao lưu.
nohup
trong if
trường hợp đó?
Trong trường hợp của tôi, tôi muốn thực hiện kiểm tra đó để chạy lệnh vá sẽ không kết thúc với một thiết bị đầu cuối tương tác hỏi phải làm gì (đặc biệt là đối với CI).
Hóa ra nếu bạn chỉ cần bạn cũng có thể sử dụng --forward
đối số và nó sẽ bỏ qua bản vá nếu đã được áp dụng!