Làm thế nào để mở rộng bí danh nội tuyến trong bash?


84

Có cách nào để mở rộng bí danh nội tuyến trong bash không?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 

Câu trả lời:


107

Bạn có thể nhấn Ctrl- Alt- eđể thực hiện chức năng đọc shell-expand-linesẽ mở rộng bí danh, lịch sử và từ. Lưu ý rằng trên một số bàn phím Metalà không Alt. Bạn có thể cần nhấn Escsau đó Ctrl-e

Các chức năng alias-expand-linehistory-and-alias-expand-linekhông bị ràng buộc theo mặc định, nhưng bạn có thể liên kết chúng bằng cách thêm các dòng tương tự như sau vào ~/.inputrctệp của bạn .

"\e\C-l": alias-expand-line

mà sẽ làm Ctrl- Alt- l(chữ thường "ell") chỉ thực hiện mở rộng bí danh.


Chúng tôi có thể ánh xạ mở rộng bí danh thành <tab> mà không ảnh hưởng đến các lần hoàn thành bash khác không?.
asdfg

2
@asdfg: Nếu bạn làm, nó sẽ phá vỡ các hoàn thành khác. Nó có thể hoạt động (chưa được kiểm tra) để tạo bản đồ như được hiển thị ở trên và sau đó thêm bản đồ bổ sung này để thay thế bản đồ hiện có cho Tab: "\C-i": "\e\C-l\e\e"tạo một macro thực hiện cả hai alias-expand-linecomplete. Nó phụ thuộc vào ràng buộc từ câu trả lời của tôi ở trên và ràng buộc mặc định cho Esc-Esc vẫn được giữ nguyên. Bạn vẫn có thể thực hiện Esc-Esc nếu bạn muốn hoàn thành mặc định.
Dennis Williamson

4
Thật vậy, ESC C-elàm việc cho Bash, nhưng C-x alàm việc cho Zsh. Cũng đã thử nghiệm trên OS X.
Blaz

Nếu bạn chỉ đơn giản là tìm kiếm Ctrl + một cái gì đó, trong đó một cái gì đó có thể là phím "x", bạn có thể làm điều đó như thế này trong một số hệ thống : Control-x: history-and-alias-expand-line.
igordcard

1
@ WeijunZhou: Điều đó phụ thuộc vào trình quản lý cửa sổ của bạn và bất kỳ cài đặt tùy chỉnh nào bạn có. Ví dụ, đối với Gnome, màn hình khóa là Super + L.
Dennis Williamson

2

Đây thực sự có thể là một cách đơn giản hơn nhiều để làm những gì bạn đang cố gắng ( bashphiên bản> = 4.2,29):

shopt -s direxpand
shopt -s expand_aliases

shopt's manpage: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html


3
Cái này sai. Các tùy chọn Shell "direxpand" và "extend_aliases" không giúp mở rộng các bí danh nội tuyến giống như câu hỏi chỉ định. Tôi không biết chiếc mũ "direxpand" nào được lấy ...? Theo mặc định, "extend_aliases" đã được đặt. Nếu bạn không đặt nó, kết quả là về cơ bản vô hiệu hóa các bí danh hoạt động (chúng không được mở rộng trước khi giải thích dòng lệnh). Ví dụ, được đặt một bí danh alias ll='ls -l, shell sẽ hiểu 'll' là lệnh / hàm 'll' có khả năng không tồn tại.
FooF

0

Điều này không hoạt động. Nhưng tôi đoán / hy vọng điều gì đó như thế này có thể được thực hiện để làm những gì bạn muốn làm. Bạn sẽ phải sử dụng kịch bản hoàn thành của riêng bạn. Đây là cách bạn tạo một:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Bây giờ, nguồn tệp bash_completion đầy đủ ( http://caliban.org/bash ) và đặt tập lệnh được đề cập ở trên vào một tệp trong thư mục bash_completion.d mà tập lệnh bạn nhận được từ các tham chiếu url. Hãy cho tôi biết nếu nó không hoạt động.

Cảm ơn.


0

Đối với những người đã cài đặt zsh đang tìm kiếm một giải pháp đơn giản, globalias có thể là bạn của bạn

Mở rộng tất cả các biểu thức toàn cầu, các tiểu ban và bí danh (bao gồm toàn cầu).

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

để cài đặt, chỉ cần thêm "globalias" vào danh sách plugin .zshrc của bạn

plugins=(... globalias)

Sau đó chỉ cần nhấn SPACEđể kích hoạt mở rộng lệnh bạn đã viết.

Nếu bạn chỉ muốn chèn một khoảng trắng mà không mở rộng dòng lệnh, hãy nhấn CTRL+SPACE

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.