guarda l'espansione dell'alias di comando


67

Se viene eseguito il watchcomando contenente un alias, non espanderà l'alias. Ho provato sia con virgolette singole che doppie, in realtà dato il seguente alias:

# alias ll
alias ll='ls -l --color=tty'

Il seguente comando fallirà

# watch ll
sh: ll: command not found

In questo caso l'espansione della riga di comando non dovrebbe funzionare?

Risposte:


98

Gli alias vengono espansi solo come primo argomento o dopo un altro alias con uno spazio finale alla fine del comando.

Da bash's help alias:

Uno spazio finale in VALUE fa sì che la parola successiva venga controllata per la sostituzione dell'alias quando l'alias viene espanso.

Per fare ciò, prova quanto segue:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Tenere presente che alcune versioni dei watchcolori delle strisce per impostazione predefinita, in alcune versioni è possibile arrestare utilizzando --coloro -G.


1
Questa è una risposta assolutamente fantastica! Grazie e +1 ovviamente.
ztank1013,

1
Grazie ... Per tutto questo tempo, ho usato 1. digitare ll, 2. premere ctrl + alt + e, 3. quindi prefisso watch. Questo è un risparmio di tempo.
anishsane,

10
Sfortunatamente questo metodo ha una limitazione a cui non è possibile fornire opzioni watchperché l'alias deve essere la parola successiva, mentre watchper eseguire il comando necessita dei suoi argomenti. Se hai provato watch -n 10 <alias>, bash non espande l'alias. Per aggirare il problema, è necessario un alias che includa le opzioni desiderate (ad esempio, `alias watch-10 = 'watch -n 10'), sempre con uno spazio finale.
indiv

2

Forse potremmo espandere manualmente l'alias prima che Watch lo veda?

watch $(alias ll | cut -d\' -f2)

Spiegazione

L'output di alias llassomiglia a:

$ alias ll
alias ll='ls -lAGh'

Quindi impostiamo il delimitatore di taglio in virgoletta singola e tagliamo il 2 ° campo, lasciando:

ls -lAGh

cioè l'alias espanso. Ciò quindi forma gli argomenti dati watch.

Crea una funzione per farlo

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Poi,

watcha ll

funziona come desiderato. Questo è terribile e fallirà in ogni tipo di situazione. Scusate.


0

Ho pensato che qui il problema di base sia durante l'esecuzione watch, l'argomento è dato a " sh -c", il che significa che se l'alias llnon è definito sh(dash shell's)nell'ambiente, non lo espanderà. Ma mi sbagliavo e non è così, la risposta di Chris sopra è giusta.


2
Non esattamente. Prova watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Down,

+1 per una risposta immediata per verificarlo. Ho sbagliato sopra.
Sachin Divekar,

@ChrisDown, quindi anche se l'orologio utilizza " sh -c" la tua spiegazione è applicabile shanche per . Ho ragione?
Sachin Divekar,

1
Dipende da quale shell viene utilizzata sh. Si noti che questo fa il lavoro:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris giù

0

Hanno watcheseguito una nuova shell interattiva, che espanderà l'alias:

watch -x bash -i -c ll

(L' -xintenzione è di smettere watchdi usare il proprio sh -cper racchiudere il nostro comando dato. Non lo vogliamo perché dobbiamo passare -ia , sho bashper renderlo una shell interattiva, che legge .bashrc e definisce gli alias. Con -x, watch esegue il comando utilizzando exec.)

Gah, in realtà, questo non funziona. Dopo aver visualizzato l'output di 'll' una volta, quindi dormendo 2 secondi, il lavoro viene eseguito in background, con il leggermente enigmatico:

1]+  Stopped                 watch -x bash -i -c ll

Perché si è fermato? Dov'è finito il tutore aperto [? Accidenti, ho pensato che sarebbe stata un'ottima risposta, ma non riesco a farlo funzionare.

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.