Trong một cuốn sách đường ray, tác giả đã viết kịch bản để cài đặt rvm ruby.
bash <<(curl -s https://rvm.beginrescueend.com/install/rvm)
Nhưng tôi không hiểu làm thế nào nó hoạt động. Bạn có thể giải thích điều này?
Trong một cuốn sách đường ray, tác giả đã viết kịch bản để cài đặt rvm ruby.
bash <<(curl -s https://rvm.beginrescueend.com/install/rvm)
Nhưng tôi không hiểu làm thế nào nó hoạt động. Bạn có thể giải thích điều này?
Câu trả lời:
Có một toán tử << (tài liệu ở đây) nhưng nó không phải là những gì được sử dụng ở đây.
Trước tiên, bạn có một chuyển hướng đầu vào <
trong đó cho biết chọn đầu vào từ đối số sau, sau đó có sự <(command)
thay thế quy trình gọi là thay thế bởi một bộ mô tả tệp có chứa đầu ra của lệnh.
Lệnh này có thể đã được viết
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
nhưng chỉ là một cách làm phức tạp:
curl -s https://rvm.beginrescueend.com/install/rvm | bash
one <<(two)
chạy lệnh two
và dẫn đầu ra của nó vào one
. Cách viết phổ biến hơn two | one
, vì vậy lệnh của bạn cũng có thể được viết:
curl -s https://rvm.beginrescueend.com/install/rvm | bash
Liên kết đó đã bị hỏng ngay bây giờ, nhưng trang web nói sẽ sử dụng thay thế này:
curl -L get.rvm.io | bash -s stable
curl
xuất ra những gì nó tải xuống, vì vậy điều này tải tập tin vào get.rvm.io
và chuyển nội dung của nó vào bash. Nếu bạn chỉ chạy curl
lệnh đó, bạn có thể thấy bash
tập lệnh tải xuống và cài đặt rvm
|
là quen thuộc hơn với tôi. Tại sao anh ta sử dụng cú pháp kỳ lạ. Là sử dụng đó là một xu hướng?
pipe
một trong hai?
<<
là nhà điều hành tài liệu ở đây . foo < <(bar)
Hầu hết tương đương với bar | foo
, nhưng với một vài điểm khác biệt không quan trọng ở đây: chủ yếu, với < <(…)
, foo
thực thi trong môi trường shell chính và lệnh trả về khi foo
trả về, trong khi với một đường ống, foo
thực thi trong một lớp con và đường ống chờ cả hai các lệnh để hoàn thành. (Đó là trong bash, hành vi này là chặt chẽ hơn trong ksh và zsh.)