как расширить псевдонимы, встроенные в Bash?

22720
asdfg

Есть ли способ расширить псевдонимы, встроенные в Bash?

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

4 ответа на вопрос

93
Dennis Williamson

You can press Ctrl-Alt-e to perform the readline function shell-expand-line which will do alias, history and word expansions. Note that on some keyboards Meta is not Alt. You might need to press Esc then Ctrl-e

The functions alias-expand-line and history-and-alias-expand-line are not bound by default, but you can bind them by adding lines similar to the following to your ~/.inputrc file.

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

which would make Ctrl-Alt-l (lower case "ell") perform only alias expansion.

Можем ли мы сопоставить расширение псевдонима с не влияя на другие завершения bash ?. asdfg 13 лет назад 0
@asdfg: Если вы это сделаете, это нарушит другие дополнения. * Может * (не проверено) создать карту, как показано выше, а затем добавить эту дополнительную карту, чтобы заменить существующую для Tab: `" \ Ci ":" \ e \ Cl \ e \ e "`, которая создает макрос который выполняет как `alias-expand-line`, так и` complete`. Это зависит от привязки из моего ответа выше и от того, что привязка по умолчанию для Esc-Esc остается на месте. Вы все равно сможете выполнять Esc-Esc, если хотите выполнить завершение по умолчанию. Dennis Williamson 13 лет назад 2
ESC, а затем CTRL + E работает на OS X, спасибо! Chris Wagner 10 лет назад 9
Действительно, `ESC Ce` работает для Bash, но` Cx a` работает для Zsh. Также проверено на OS X. Blaz 8 лет назад 3
Если вы просто ищете Ctrl + что-то, где что-то может быть клавишей «x», вы можете сделать это следующим образом в некоторых системах: `Control-x: history-and-alias-expand-line`. igordcard 7 лет назад 0
Обратите внимание, что когда вы вручную раскрываете псевдонимы, содержащие кавычки (например, `alias foo = 'this" bar "'`), кавычки исчезают при расширении с помощью Ctrl + Alt + E. Но будьте уверены, что они правильно отправляются фактической команде, когда вы * действительно * используете псевдоним. Вы можете убедиться в этом, поместив параметр `--something` в двойные кавычки. Команда будет работать при использовании в качестве псевдонима. Но ваша программа потерпит неудачу с сообщением типа «недопустимая опция - что-то», если ее вручную развернуть до версии без кавычек. gw0 7 лет назад 0
`Ctrl-Alt-l` заблокировал мой сеанс X ... Я бы предложил использовать другие комбинации. Weijun Zhou 5 лет назад 0
@WeijunZhou: это зависит от вашего оконного менеджера и любых ваших пользовательских настроек. Для Gnome, например, экран блокировки - Super + L. Dennis Williamson 5 лет назад 1
3
starscream_disco_party

На самом деле это может быть гораздо более простой способ сделать то, что вы пытаетесь сделать ( 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

Это не верно. Параметры оболочки "direxpand" и "expand_aliases" не помогают расширять встроенные псевдонимы, как указано в вопросе. Я не знаю, из какой шапки "direxpand" был взят ...? По умолчанию «expand_aliases» уже установлено. Если вы отключите его, результатом будет отключение псевдонимов от работы (они не раскрываются до интерпретации командной строки). Например, имея псевдоним `alias ll = 'ls -l`, оболочка интерпретирует' ll 'как команду / функцию' ll ', которая, вероятно, не существует. FooF 6 лет назад 1
0
0fnt

This does not work. But I'm guessing/hoping something like this can be done to do what you want to do. You would have to use your own completion script. This is how you make one:

_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 

Now source the full bash_completion file(http://caliban.org/bash) and put the above mentioned script in a file inside bash_completion.d directory that the script you get from the url references. Let me know if it doesn't work.

Thanks.

0
Can

Для тех, кто установил zsh и ищет простое решение, globalias может быть вашим другом

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

# .zsrc: alias S="sudo systemctl"  $ S<space> # expands to: $ sudo systemctl 

для установки просто добавьте "globalias" в список плагинов .zshrc

plugins=(... globalias) 

Затем просто нажмите, SPACEчтобы запустить расширение команды, которую вы написали.

Если вы хотите вставить только пробел без расширения командной строки, нажмите CTRL+SPACE