come espandere gli alias in linea in bash?


84

C'è un modo per espandere gli alias in linea in bash?

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

Risposte:


107

È possibile premere Ctrl- Alt- eper eseguire la funzione readline shell-expand-lineche eseguirà alias, cronologia ed espansioni di parole. Si noti che su alcune tastiere Metanon lo è Alt. Potrebbe essere necessario premere Escquindi Ctrl-e

Le funzioni alias-expand-linee history-and-alias-expand-linenon sono associate per impostazione predefinita, ma puoi associarle aggiungendo al file linee simili alle seguenti ~/.inputrc.

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

che farebbe Ctrl- Alt- l("ell" minuscola) eseguire solo l' espansione dell'alias.


Possiamo mappare l'espansione dell'alias su <tab> senza influenzare altri completamenti di bash ?.
asdfg,

2
@asdfg: se lo fai, si interromperanno altri completamenti. Si potrebbe lavorare (non testata) per creare la mappa, come indicato sopra e quindi aggiungere questa mappa aggiuntiva per sostituire quello esistente per la Tab: "\C-i": "\e\C-l\e\e"che crea una macro che esegue sia alias-expand-linee complete. Dipende dall'associazione della mia risposta precedente e che l'associazione predefinita per Esc-Esc rimane in vigore. Saresti comunque in grado di eseguire Esc-Esc se desideri eseguire il completamento predefinito.
Dennis Williamson,

4
In effetti, ESC C-elavora per Bash, ma C-x afunziona per Zsh. Testato anche su OS X.
Blaz,

Se siete semplicemente alla ricerca di qualcosa di Ctrl +, dove qualcosa può essere la chiave "x", si può fare in questo modo in alcuni sistemi: Control-x: history-and-alias-expand-line.
igordcard

1
@WeijunZhou: dipende dal gestore delle finestre e da eventuali impostazioni personalizzate. Per Gnome, ad esempio, la schermata di blocco è Super + L.
Dennis Williamson,

2

Questo in realtà potrebbe essere un modo molto più semplice di fare ciò che stai cercando ( bashversione> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

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


3
Questo è sbagliato. Le opzioni della shell "direxpand" e "expand_aliases" non aiutano ad espandere gli alias in linea come specificato dalla domanda. Non so da quale cappello "direxpand" è stato preso ...? Per impostazione predefinita, "expand_aliases" è già impostato. Se lo disattivi, il risultato è sostanzialmente quello di disabilitare gli alias (non vengono espansi prima dell'interpretazione della riga di comando). Ad esempio, dato un alias alias ll='ls -lla shell interpreterebbe 'll' come comando / funzione 'll' che probabilmente non esiste.
FooF

0

Questo non funziona. Ma sto indovinando / sperando che qualcosa del genere possa essere fatto per fare quello che vuoi fare. Dovresti usare il tuo script di completamento. Ecco come ne crei uno:

_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

Ora cerca il file completo bash_completion ( http://caliban.org/bash ) e metti lo script sopra menzionato in un file nella directory bash_completion.d che lo script che ottieni dai riferimenti url. Fammi sapere se non funziona.

Grazie.


0

Per le persone che hanno installato zsh alla ricerca di una soluzione semplice, globalias potrebbe essere tuo amico

Espande tutte le espressioni globali, i sottocomandi e gli alias (incluso globale).

# .zsrc:
alias S="sudo systemctl"

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

per installare basta aggiungere "globalias" al tuo elenco di plugin .zshrc

plugins=(... globalias)

Quindi premi SPACEper attivare l'espansione di un comando che hai scritto.

Se si desidera solo inserire uno spazio senza espandere la riga di comando, premere CTRL+SPACE

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.