Tại sao sử dụng cài đặt chứ không phải cp và mkdir?


68

Tôi đã thấy ở nhiều nơi được sử dụng install -dđể tạo thư mục và install -csao chép một tập tin. Tại sao không sử dụng mkdircp? Có một lợi thế trong việc sử dụng install?

Câu trả lời:


59

Nó phụ thuộc vào những gì bạn đang làm.

Các installlệ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-cbạ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 cpvà 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-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 installrú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 .


22

"cài đặt" thường kết hợp các hành động sau:

  • Sao chép tệp đã chỉ định vào vị trí đích đang được thực hiện đối với các quy trình sử dụng bản sao cũ. Không giống như "cp", "cài đặt" hoặc hủy liên kết tệp trước khi tạo tệp mới hoặc (trong hệ thống BSD, với công tắc -S) tạo một tệp mới và đổi tên thành tên đích về nguyên tử, tránh điều kiện chạy đua giữa cài đặt và mở lại . Nếu không sử dụng điều này, sao chép có thể thất bại (với ETXTBSY) cho tệp nhị phân đang chạy hoặc gây ra sự cố nếu tệp thư viện hoặc dữ liệu bị thay thế.
  • Đặt thông tin xác thực phù hợp cho tệp mới mà không cần các lệnh riêng biệt.
  • Tạo thư mục trung gian, nếu được yêu cầu.
  • Tránh sửa đổi tệp mục tiêu nếu nó giống hệt với phiên bản mới (công tắc -C).

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.


2
Việc sử dụng installhoặ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.
Kaz

Tôi đang gặp phải cuộc đua trong cài đặt coreutils ... có cách khắc phục hay giải pháp thay thế nào chính xác không?
trent

@trentw loại chủng tộc nào?
Lấy

8

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 cpinstall, ít nhất là trên Linux. Nếu sao chép qua một tệp hiện có, cpghi đè lên nút inode hiện có của tệp, trong khi installluô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 cpgây ra lỗi EBUSY, trong khi installsẽ 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.


Điều đó thật thú vị ... Vì vậy, nó có thể tạo một tệp có cùng tên nhưng inode khác nhau?
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel Có. Đối với người dùng, sẽ chỉ có một tệp, vì các tệp thường được tra cứu theo tên. Nhưng đối với hệ thống tệp, có hai tệp miễn là một số quy trình giữ tham chiếu đến tệp cũ. Điều tương tự có thể đạt được nếu bạn đổi tên hoặc xóa một tệp được mở bởi một quy trình, sau đó tạo một tệp mới có cùng tên tệp.
Tomas Skäre

4

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ệp
  • install -d sẽ không cố thiết lập các bit chế độ sở hữu và tệp

Đây là cho mkdirinstalltừ lõi core GNU . Cả hai đều sử dụng cùng một make_dir_parentschức năng, nhưng với preserve_existingtham số đang được đặt thành falsehoặc true, tương ứng.


1
Sự khác biệt hữu ích!
Victor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.