expansão de alias de comando do watch

67

Se um watchcomando executar um alias, ele não expandirá o alias. Eu tentei com aspas simples e aspas duplas, de fato, com o seguinte apelido:

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

O comando a seguir falhará

# watch ll
sh: ll: command not found

A expansão da linha de comando não deve funcionar neste caso?

ztank1013
fonte

Respostas:

98

Os aliases são expandidos apenas como o primeiro argumento ou após outro alias com um espaço à direita no final do comando.

De bash's help alias:

Um espaço à direita em VALUE faz com que a próxima palavra seja verificada quanto à substituição de alias quando o alias for expandido.

Para fazer isso, tente o seguinte:

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

Lembre-se de que algumas versões de watchcores de tira, por padrão, podem ser interrompidas em algumas versões usando --colorou -G.

Chris Down
fonte
11
Esta é uma resposta absolutamente incrível! Obrigado e +1, é claro.
ztank1013
11
Obrigado ... Durante todo esse tempo, eu costumava 1. digitar ll, 2. pressione ctrl + alt + e, 3. e prefixo watch. Isso economiza tempo.
Anishsane 10/05
10
Infelizmente, esse método tem uma limitação à qual você não pode fornecer opções watchporque o alias precisa ser a próxima palavra, enquanto watchprecisa de seus argumentos antes da execução do comando. Se você tentou watch -n 10 <alias>, o bash não expandirá o alias. Para contornar isso, você precisa de um alias que inclua as opções desejadas (por exemplo, `alias watch-10 = 'watch -n 10'), ainda com um espaço à direita.
indiv 10/07
2

Talvez possamos expandir manualmente o alias antes que o relógio o veja?

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

Explicação

A saída de se alias llparece com:

$ alias ll
alias ll='ls -lAGh'

Então, definimos o delímetro do corte como aspas simples e cortamos o segundo campo, deixando:

ls -lAGh

ou seja, o alias expandido. Que então forma os argumentos dados watch.

Faça uma função para fazê-lo

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

Então,

watcha ll

funciona como desejado. Isso é horrível e falhará em todos os tipos de situações. Desculpa.

Jonathan Hartley
fonte
0

Eu pensei que aqui o problema básico é durante a execução watch, o argumento é dado " sh -c", o que significa que se o alias llnão estiver definido no sh(dash shell's)ambiente, ele não o expandirá. Mas eu estava errado e este não é o caso, a resposta de Chris acima está certa.

Sachin Divekar
fonte
2
Não exatamente. Tente watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Baixo
+1 para resposta imediata para verificar. Eu estava errado acima.
Sachin Divekar
@ChrisDown, portanto, mesmo que o relógio use " sh -c" a sua explicação também é aplicável sh. Estou certo?
Sachin Divekar
11
Isso depende de como o shell está sendo usado sh. Observe que este faz o trabalho:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Baixo
0

Executou watchum novo shell interativo, que expandirá o alias:

watch -x bash -i -c ll

(O -xobjetivo é parar watchde usar o próprio sh -cpara quebrar nosso comando. Não queremos isso porque precisamos passar -ipara shou bash, para torná-lo um shell interativo, que lê .bashrc e define aliases. Com -x, o watch executa o comando usando exec.)

Gah, na verdade, isso não funciona. Depois de exibir a saída de 'll' uma vez e, depois de dormir 2 segundos, o trabalho fica em segundo plano, com o levemente enigmático:

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

Por que parou? Para onde foi a chave aberta [? Porra, pensei que seria uma ótima resposta, mas não posso fazê-lo funcionar.

Jonathan Hartley
fonte