Tôi có thể làm bash dừng phân tích cú pháp và xác thực một bí danh nào đó không?


8

Tôi đang sử dụng Fedora 25 và đã thêm bí danh sau vào hồ sơ bash của mình:

alias releasenotes="dnf updateinfo --refresh info `dnf check-update | cut -d '.' -f 1 | xargs` | less"

(Tôi không thể sử dụng thẳng dnf updateinfo infohttps://ormszilla.redhat.com/show_orms.cgi?id=1405191 )

Bí danh của tôi hoạt động, nhưng lệnh mất khoảng 10 giây để chạy và vì bash phân tích cú pháp và xác thực tất cả các bí danh khi hồ sơ có nguồn gốc, tạo ra một vỏ mới dẫn đến treo 10 giây. Điều này thật khó chịu.

Có cách nào để làm bash không cố phân tích và xác thực các bí danh - hay chỉ có vậy?

Câu trả lời:


9

Tôi đoán tốt nhất là bạn có lẽ nên sử dụng dấu ngoặc đơn xung quanh định nghĩa bí danh.

Tôi biết rằng khi sử dụng dấu ngoặc kép, các biến shell được thay thế bằng nội dung của chúng ở giai đoạn định nghĩa bí danh (như bạn đã nói phân tích và xác thực) và backticks hoặc thay thế shell như $ (lệnh).

Một lời giải thích tốt hơn là trong câu hỏi Unix SE này !

Nếu điều đó không giúp làm cho lời nhắc tải nhanh hơn một lần nữa, hãy xác định hàm shell thay vì bí danh.

chỉnh sửa: Đừng quên hoán đổi đối số cắt thành dấu ngoặc kép như quixotic đã đề cập.


Điều đó đã làm nó! Bạn đã trả lời đầu tiên, vì vậy bạn nhận được tín dụng.
iLikeDirt

9

bashđang diễn giải chuỗi trích dẫn của bạn và việc giải thích đó thực thi dnf check-updatelệnh nhúng . Việc thực thi này là những gì chiếm thời gian trong định nghĩa bí danh, không phải là dnf updateinfolệnh chính mà bạn đang đặt bí danh. Hãy thử một ví dụ giả định dựa trên sleepvà lưu ý cách aliasbản thân mất 5 giây:

alias sleep5="echo 'wake' ; `sleep 5` ; echo 'done'"

Sử dụng dấu ngoặc đơn để tránh việc giải thích:

alias releasenotes='dnf updateinfo --refresh info `dnf check-update | cut -d "." -f 1 | xargs` | less'

Đừng quên hoán đổi cutđối số thành dấu ngoặc kép.

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.