Tôi có một bộ thư mục, một số trong đó chứa tệp tạo tệp và một số tệp tạo tệp có cleanmục tiêu. Trong thư mục cha, tôi có một tập lệnh đơn giản:
#!/bin/bash
for f in *; do
if [[ -d $f && -f $f/makefile ]]; then
echo "Making clean in $f..."
make -f $f/makefile clean
fi
done
Điều này thực hiện một điều kỳ lạ khi nó chạm vào một thư mục với tệp thực hiện mà không có mục tiêu "sạch" (được xác định). Ví dụ, đưa ra hai thư mục, onevà two, có chứa;
một / làm cho
clean:
-rm *.x
hai / makefile
clean:
Trong trường hợp thứ hai, "sạch" có mặt mà không có chỉ thị, vì vậy nếu bạn chạy "làm sạch" trong twobạn sẽ nhận được:
make: Nothing to be done for `clean'.
Nếu không có "sạch":
make: *** No rule to make target `clean'. Stop.
Tuy nhiên, đối với vấn đề tôi sắp mô tả, kết quả là như nhau cho dù mục tiêu có mặt nhưng không xác định hoặc chỉ không hiện diện. Chạy clean.shtừ thư mục cha mẹ;
Making clean in one...
rm *.x
rm: cannot remove `*.x': No such file or directory
make: [clean] Error 1 (ignored)
Vì vậy, onekhông cần làm sạch. Không có vấn đề lớn, điều này là như mong đợi. Nhưng sau đó:
Making clean in two...
cat clean.sh >clean
chmod a+x clean
Tại sao cat clean.sh>cleanvv? Lưu ý tôi đã tạo một ví dụ tối thiểu chính xác như được hiển thị ở trên - không có tệp hoặc thư mục nào khác xung quanh (chỉ là Clean.sh, thư mục một & hai, và các tệp thực hiện rất tối thiểu). Nhưng sau khi Clean.sh chạy, makeđã sao chép clean.sh > cleanvà thực hiện nó. Nếu tôi sau đó chạy sạch. Một lần nữa:
Making clean in one...
make: `clean' is up to date.
Making clean in two...
make: `clean' is up to date.
Press any key to continue...
Một cái gì đó thậm chí còn kỳ quặc hơn, bởi vì bây giờ nó hoàn toàn không sử dụng các tệp tạo tệp được chỉ định - nó đang sử dụng một số mục tiêu bí ẩn "cập nhật".
Tôi đã nhận thấy một hiện tượng có lẽ liên quan: nếu loại bỏ một trong các mệnh đề kiểm tra trong sạch. Như thế này:
# if [[ -d $f && -f $f/makefile ]]; then
if [[ -d $f ]]; then
Và tạo một thư mục threekhông có tệp thực hiện, một phần của đầu ra bao gồm:
Making clean in three...
make: three/makefile: No such file or directory
make: *** No rule to make target `three/makefile'. Stop.
Rằng tôi không có tập tin hoặc thư mục như vậy, nhưng tại sao makesau đó lại tiếp tục tìm kiếm một mục tiêu với tên đó? Trang người đàn ông có vẻ khá đơn giản:
tập tin -f, --file = tập tin, --makefile = TẬP_TIN
Use file as a makefile.
make -npf /dev/null(hoặcgmaketùy thuộc vào hệ thống) có thể được sử dụng để kết xuất cơ sở dữ liệu các quy tắc ngầm cho phiên bản chính xác đó. Đã giúp tôi đôi khi.