як розгорнути псевдоніми, вбудовані в bash?


84

Чи є спосіб розширити псевдоніми inline в bash?

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

Відповіді:


107

Ви можете натиснути Ctrl- Alt-, eщоб виконати функцію читання ліній, shell-expand-lineяка буде виконувати псевдоніми, історію та розширення слів. Зауважте, що на деяких клавіатурах Metaнемає Alt. Вам може знадобитися натиснути Escпотім Ctrl-e

Функції alias-expand-lineі history-and-alias-expand-lineне пов'язані за замовчуванням, але ви можете пов'язати їх, додаючи рядки , схожі на такі рядки в ваш ~/.inputrcфайл.

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

що змусить Ctrl- Alt- l(нижній регістр "ell") виконувати лише псевдонім розширення.


Чи можемо ми відобразити розширення псевдоніму до <tab>, не впливаючи на інші завершення bash ?.
asdfg

2
@asdfg: Якщо ви зробите це, це порушить інші завершення. Він може працювати (неперевірені) , щоб створити карту , як показано вище , і потім додати додаткову карту , щоб замінити існуючий на вкладці: "\C-i": "\e\C-l\e\e"який створює макрос , який виконує як alias-expand-lineі complete. Це залежить від прив'язки з моєї відповіді вище, і те, що прив'язка Esc-Esc за замовчуванням залишається в силі. Ви все одно зможете виконати Esc-Esc, якби хотіли виконати за замовчуванням.
Денніс Вільямсон,

4
Дійсно, ESC C-eпрацює на Bash, але C-x aпрацює на Zsh. Тестували також на OS X.
Blaz

Якщо ви просто шукаєте Ctrl + що - то, де - то може бути ключ «х», ви можете зробити це , як це в деяких системах: Control-x: history-and-alias-expand-line.
igordcard

1
@WeijunZhou: Це залежить від вашого менеджера вікон та будь-яких спеціальних налаштувань. Для Gnome, наприклад, екран блокування - Super + L.
Денніс Вільямсон

2

Це насправді може бути набагато простішим способом зробити те, що ви намагаєтесь ( bashверсія> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt«S manсторінка: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html


3
Це неправильно. Параметри оболонки "direxpand" і "expand_aliases" не допомагають розширити псевдоніми в рядку, як зазначено в питанні. Не знаю, з якого капелюха "direxpand" взяли ...? За замовчуванням "expand_aliases" вже встановлено. Якщо ви вимкнете його, результатом є в основному відключення псевдонімів від роботи (вони не розгортаються перед інтерпретацією командного рядка). Наприклад, наданий псевдонім, alias ll='ls -lоболонка буде інтерпретувати 'll' як команду / функцію 'll', яка, ймовірно, не існує.
FooF

0

Це не працює. Але я здогадуюсь / сподіваюся, що щось подібне можна зробити, щоб зробити те, що ви хочете зробити. Вам доведеться використовувати власний сценарій завершення. Ось як ви робите:

_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

Тепер джерело повного файлу bash_completion ( http://caliban.org/bash ) та вкажіть вищезгаданий скрипт у файл у каталозі bash_completion.d, щоб той сценарій, який ви отримали із посилань на URL. Повідомте мене, якщо це не працює.

Дякую.


0

Для людей, які встановили zsh і шукають просте рішення, глобалії можуть стати вашим другом

Розширює всі глобальні вирази, підкоманди та псевдоніми (включаючи глобальні).

# .zsrc:
alias S="sudo systemctl"

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

для встановлення просто додайте "globalias" до вас .zshrc список плагінів

plugins=(... globalias)

Потім просто натисніть, SPACEщоб запустити розширення написаної вами команди.

Якщо ви хочете вставити пробіл лише без розширення командного рядка, натисніть CTRL+SPACE

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.