Tôi đã thấy ở nhiều nơi được sử dụng install -d
để tạo thư mục và install -c
sao chép một tập tin. Tại sao không sử dụng mkdir
và cp
? Có một lợi thế trong việc sử dụng install
?
Tôi đã thấy ở nhiều nơi được sử dụng install -d
để tạo thư mục và install -c
sao chép một tập tin. Tại sao không sử dụng mkdir
và cp
? Có một lợi thế trong việc sử dụng install
?
Câu trả lời:
Nó phụ thuộc vào những gì bạn đang làm.
Các install
lệnh thường được sử dụng trong các kịch bản cài đặt đi kèm với gói và mã nguồn cho việc lắp đặt một hệ nhị phân để hệ thống của bạn. Nó cũng có thể được sử dụng để cài đặt bất kỳ tập tin hoặc thư mục khác. Ngoài các tùy chọn -d
và -c
bạn có -m
để chỉ định các quyền mới của tệp sẽ được cài đặt, vì vậy bạn không phải thực hiện a cp
và a chmod
để có được kết quả tương tự. Ví dụ:
install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"
Bạn cũng có các tùy chọn -g
và -o
để thiết lập nhóm mục tiêu và chủ sở hữu, tương ứng. Điều này tránh các cuộc gọi riêng biệt đến chown
. Nói chung, sử dụng install
rút ngắn tập lệnh của bạn và làm cho nó ngắn gọn hơn bằng cách thực hiện tạo tệp, sao chép, cài đặt chế độ và các nội dung liên quan trong một lệnh thay vì nhiều lệnh.
Để tham khảo, xem man install
. Để sử dụng, chỉ cần xem bất kỳ tập lệnh cài đặt nào được gửi cùng với một số mã nguồn gói .
"cài đặt" thường kết hợp các hành động sau:
Vì vậy, nó tuân theo cách tiếp cận Unix rằng một công cụ sẽ được thực hiện cho một hành động duy nhất nhưng hoàn chỉnh là cài đặt một tệp được tạo bởi một công cụ xây dựng nào đó vào vị trí làm việc của nó.
Khái niệm hoàn chỉnh như tôi đã mô tả được triển khai trong các hệ thống BSD (trong phiên bản được gọi là "xinstall"); Tôi coi chế độ "sao chép an toàn" ở đây (phiên bản mới với đổi tên nguyên tử) là rất quan trọng cho việc này. Các hệ thống Linux (từ coreutils) bỏ lỡ phần quan trọng này và có xu hướng chạy đua giữa việc xóa và mở lại bởi một quy trình bên ngoài; nhưng điều này có thể đã được bảo hiểm bởi các nhà quản lý gói.
Ngoài các mô tả trước đây về việc sử dụng, còn có sự khác biệt ở mức độ thấp giữa cp
và install
, ít nhất là trên Linux. Nếu sao chép qua một tệp hiện có, cp
ghi đè lên nút inode hiện có của tệp, trong khi install
luôn tạo một nút mới cho cùng tên tệp.
Điều này tạo ra sự khác biệt khi cài đặt phiên bản mới của tệp nhị phân đang chạy. Sử dụng cp
gây ra lỗi EBUSY, trong khi install
sẽ thành công. Nhị phân đang chạy sẽ vẫn sử dụng phiên bản cũ, nhưng phiên bản mới được sử dụng nếu chương trình được khởi động lại.
Nếu thư mục trong câu hỏi đã tồn tại:
mkdir -p
sẽ cố gắng thiết lập các bit chế độ sở hữu và tệpinstall -d
sẽ không cố thiết lập các bit chế độ sở hữu và tệpĐây là cho mkdir
và install
từ lõi core GNU . Cả hai đều sử dụng cùng một make_dir_parents
chức năng, nhưng với preserve_existing
tham số đang được đặt thành false
hoặc true
, tương ứng.
install
hoặc$(INSTALL)
trong tệp tạo tệp cũng đánh dấu các bước đó là các bước sao chép cài đặt và không phải là một số bước sao chép thông thường. Điều đó có thể hữu ích.