Cách mở rộng * trên dòng lệnh Bash


34

Tôi hiểu rằng nếu bạn gõ ls *nó thực sự mở rộng để ls a b ckhi dòng điện trực tiếp có các file a, bc.

Tôi đã tự hỏi nếu có một cách để mở rộng điều này trước khi tôi nhấn enter. Tương tự như cách Ctrl + X hoạt động hoặc tab hoàn thành hoạt động.

Vì vậy, để làm cho mình rõ ràng

$ ls *
<press magic key>
$ ls a b c

theo cách tương tự như:

$ ls ~/
<press tab>
$ ls /home/username

Tôi nghĩ rằng tôi đã nhìn thấy điều này trước đây nhưng tôi có thể đã bị nhầm lẫn.


Chà, tôi biết rất ít nhưng điều tốt nhất tôi biết là $ echo * <ENTER> Bạn có thể làm điều đó trước lệnh ls *. Tất nhiên, đó không phải là một tab hay một phím tắt để mở rộng nó.
barlop

Nhưng có lẽ người dùng linux sẽ không làm bất cứ điều gì như ls * nhiều 'vì nó có thể không cần thiết với ls, nhưng cũng có thể hoạt động khác nhau trên các shell khác nhau nên nó không dễ mang theo, nhưng khi thuận tiện thì tốt. Nhưng trong trường hợp của ls, không cần thiết. ls * / liệt kê các thư mục nhưng không quá nhiều những gì ls được thiết kế để làm.
barlop

Câu trả lời:


19

Bạn có thể sử dụng glob-expand-wordchức năng, từ người đàn ông bash:

Từ trước điểm được coi là mẫu cho tên đường dẫn
mở rộng và danh sách các tên tệp phù hợp được chèn vào,
thay thế từ. Nếu một đối số số được cung cấp, một
dấu hoa thị được nối trước khi mở rộng tên đường dẫn.

Thêm một cái gì đó như thế này vào ~/.inputrc:

Control-x: glob-expand-word

Vì vậy, $ ls *theo sau Ctrl-Xsẽ mở rộng đến $ ls a b c, trong ví dụ của bạn.


8
Nó đã bị ràng buộc. Và Ctrl-x đã bị ràng buộc như một tiền tố cho một loạt các công cụ. Làm bind -p | grep 'C-x'để nhìn thấy chúng.
Tạm dừng cho đến khi có thông báo mới.

Đó chính xác là những gì tôi đang tìm kiếm! Cảm ơn
bramp

@Dennis, nó không bị ràng buộc, nhưng thêm nó vào .inputrc của tôi thì có. Tôi đoán đó là mặc định của Debian.
bramp

3
@Dennis: Nó bị ràng buộc C-x*vào hệ thống của tôi.
cYrus


11

Khi bạn ở vichế độ ( set -o vi), "chìa khóa ma thuật" là Esc*. Điều này làm việc với cả bashksh.


Để rõ ràng với vimmer, trước tiên hãy gõ dấu hoa thị trong khi gõ dòng lệnh bình thường, sau đó thoát khỏi chế độ chỉnh sửa, con trỏ sẽ xác định vị trí trên dấu hoa thị nếu bạn thoát ngay lập tức, sau đó nhấn dấu hoa thị với con trỏ nằm trên dấu hoa thị và hình cầu sẽ mở rộng và thả bạn trong chế độ chỉnh sửa một lần nữa.
NeilG

4
$ bind -q global-extend-word
toàn cầu có thể được gọi thông qua "\ Cx *".

$ bind -q chèn-hoàn thành
hoàn thành chèn có thể được gọi thông qua "\ e *".

Vì vậy, để sử dụng chúng ta có thể làm

ls * Ctrl+x *

hoặc là

ls * Esc *

Mở rộng các dòng phức tạp trước khi nhấn enter


Đây là câu trả lời tốt nhất vì nó tìm kiếm các phím bấm chính xác, có thể khác nhau trong các môi trường khác nhau.
wvducky

0

Một thay thế cho từ toàn cầu mở rộng (\ Cx *) là chèn-hoàn thành (\ e *). Nó hoạt động mà không có dấu hoa thị ở cuối, nhưng nó cũng bao gồm các phần hoàn thành khác như các tệp ẩn. Tôi đã bật lại cả trong ~ / .inputrc:

# insert glob results (\C-x* by default)
"\C-g": glob-expand-word

# insert completion list (\e* by default)
"\ei": insert-completions

global-Complete-word (\ eg) có thể được sử dụng để chuyển đổi ví dụ /System/Library/Launch*/*Findersang /System/Library/LaunchAgents/com.apple.Finder.plist.

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.