Đây là một chức năng liệt kê nội dung của các thư mục $PATH
. Nếu thông qua các đối số, hàm chỉ liệt kê các lệnh có tên liên quan đến một trong các đối số. Các đối số được hiểu là mô hình toàn cầu.
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
Giống như nhiều thứ, điều này là dễ dàng hơn trong zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
Ký ^
tự trong mở rộng tham số làm cho văn bản được nối với mảng được thêm vào từng thành phần mảng, ví dụ như path=(/bin /usr/bin); echo $^path/foo
in /bin/foo /usr/bin/foo
.
/*$^@*
trông giống như một sự xúc phạm trong truyện tranh nhưng thực tế là nhân vật bình thường /
, ký tự đại diện *
, tham số đặc biệt $@
(mảng tham số vị trí) với công cụ ^
sửa đổi, và một lần nữa *
.
(N:t)
là vòng loại toàn cầu N
để có được một bản mở rộng trống nếu không có kết quả trùng khớp theo sau bởi công cụ sửa đổi lịch sử t
để chỉ giữ lại tên cơ sở (Đuôi đuôi) của mỗi trận đấu.
Khó hiểu hơn, tránh cuộc gọi bên ngoài nhưng đây chỉ là mối quan tâm của mỹ phẩm:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Trong thực tế, bạn có thể đang tìm kiếm apropos
lệnh tìm kiếm các trang man của các lệnh có mô tả ngắn chứa từ khóa. Một hạn chế là điều này chỉ tìm thấy các lệnh có trang man.
ls -la
như thế nào?