Bash bắt đầu chậm vì dòng này trong .bashrc. Điều gì có thể gây ra điều này?


19

.bashrcTập tin của tôi chứa một dòng cho hiệu ứng này:

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

Khi tôi nhận xét dòng này, Bash bắt đầu gần như ngay lập tức khi tôi mở một thiết bị đầu cuối mới. Với dòng này, có độ trễ 4-5 giây trước khi con trỏ của tôi xuất hiện.

Loại bỏ các lệnh lồng nhau $(pwd), vv cũng tăng tốc trở lại. Tại sao chuyện này đang xảy ra? Tôi vẫn có thể sử dụng các lệnh lồng nhau bằng cách nào đó?


4
Vấn đề là findlệnh, được thực thi khi khởi động và có thể mất nhiều thời gian để thực thi, tùy thuộc vào cấu trúc thư mục. Nếu bạn sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép, findsẽ được thực thi khi chạy, khi lệnh aliasđược gọi. Nó phụ thuộc vào thư mục làm việc bạn muốn sử dụng, hiện tại vào thời gian khai báo hoặc tại thời gian chạy. Nhân tiện $(pwd)là một cách khá không hiệu quả để thể hiện .hay $PWD.
AFH

15
Tôi biết đó không phải là những gì bạn đang hỏi, nhưng điều này trông rất giống vấn đề XY . Tại sao bạn cần xác định vị trí tập lệnh bằng cách sử dụng find? Một khi bạn cài đặt nó, bạn biết nó ở đâu. Ngay cả khi bạn cập nhật nó thường xuyên và thay đổi tên của nó, bạn vẫn có thể duy trì một liên kết tượng trưng cho nó để nó luôn có sẵn dưới một tên cố định.
sleske

5
@AFH Xin vui lòng gửi câu trả lời như câu trả lời, không phải ý kiến.
David Richerby

1
@DavidR Richby - Tôi muốn chắc chắn rằng đây thực sự là câu trả lời trước khi đăng. Tôi đã bối rối rằng tập lệnh sẽ hoạt động trên các tập tin được tìm thấy trong một thư mục tùy ý.
AFH

Câu trả lời:


45

Vì sự thay thế lệnh nằm trong dấu ngoặc kép, nên nó được đánh giá tại thời điểm lệnh được xác định. Điều này gây ra findđể xem qua nội dung đĩa cứng của bạn trong khi .bashrcđang chạy.

Ngược lại, bạn dường như muốn nó được đánh giá tại thời điểm sử dụng. Trong trường hợp đó, sử dụng dấu ngoặc đơn:

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

Lưu ý rằng bí danh này sẽ thất bại nếu bất kỳ tệp nào được tìm thấy có khoảng trắng trong tên của chúng. Để tránh điều đó:

alias prog='find . -name prog -exec /path/to/script.sh {} +'

Hình thức sau này sẽ hoạt động đáng tin cậy cho bất kỳ loại tên tệp.


1
"Thời gian sử dụng". Và dòng thứ hai của bạn tránh sinh ra một subshell.
rleir

11
Mặt khác, bây giờ mỗi khi bạn gõ prog, findsẽ cần phải chạy, trong khi trước đó, nó chỉ được chạy một lần (khi khởi động shell).
el.pescado

Sau đó, một lần nữa, do lưu trữ bộ đệm, lần thứ hai bạn chạy giống nhau, findnó thường nhanh hơn nhiều.
Revierpost

21
@ el.pescado Ở phía trên, thật khó để tưởng tượng rằng hành vi dự định là chạy lệnh trên các tệp tồn tại tại thời điểm người dùng đăng nhập, thay vì các tệp tồn tại khi họ thực thi lệnh để xử lý chúng.
David Richerby

2
@DavidR Richby Có lẽ chúng ta có thể lưu trữ đường dẫn progvà chạy lại findnếu đường dẫn cũ không còn tồn tại?
Alex Vong
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.