observez l'expansion des alias de commande

67

Si un exécuter la watchcommande contenant un alias, il ne développera pas l'alias. J'ai essayé les deux guillemets simples et doubles, en fait, étant donné le pseudonyme suivant:

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

La commande suivante va échouer

# watch ll
sh: ll: command not found

L'expansion en ligne de commande ne devrait-elle pas fonctionner dans ce cas?

ztank1013
la source

Réponses:

98

Les alias ne sont développés que comme premier argument ou après un autre alias avec un espace de fin à la fin de la commande.

De bash« s help alias:

Un espace de fin dans VALUE entraîne la vérification du mot suivant pour la substitution d'alias lorsque celui-ci est développé.

Pour ce faire, essayez ce qui suit:

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

Gardez à l'esprit que certaines versions des watchcouleurs de bande par défaut, sur certaines versions, cela peut être arrêté en utilisant --colorou -G.

Chris Down
la source
1
C'est une réponse absolument géniale! Merci et +1 bien sûr.
Ztank1013
1
Merci ... Pendant tout ce temps, j'avais l'habitude de 1. taper ll, 2. appuyer sur ctrl + alt + e, 3. puis préfixer watch. C'est un gain de temps.
Anishsane
10
Malheureusement, cette méthode a une limitation pour laquelle vous ne pouvez pas fournir d'options watchcar l'alias doit être le mot suivant, alors que watchses arguments doivent précéder la commande à exécuter. Si vous avez essayé watch -n 10 <alias>, bash ne développera pas l'alias. Pour contourner ce problème, vous avez besoin d'un alias incluant les options souhaitées (par exemple, `alias watch-10 = 'watch -n 10'), toujours avec un espace de fin.
Individuel
2

Peut-être pourrions-nous développer manuellement l'alias avant que la montre ne le voie?

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

Explication

La sortie de alias llressemble à:

$ alias ll
alias ll='ls -lAGh'

Nous avons donc défini le délimètre de cut sur guillemet simple et coupons le deuxième champ en laissant:

ls -lAGh

c'est-à-dire l'alias développé. Cela forme alors les arguments donnés à watch.

Faire une fonction pour le faire

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

Ensuite,

watcha ll

fonctionne comme vous le souhaitez. C'est affreux et échouera dans toutes sortes de situations. Pardon.

Jonathan Hartley
la source
0

Je pensais que le problème de base est lors de l'exécution watch, l'argument est donné à " sh -c" ce qui signifie que si un alias lln'est pas défini dans l' sh(dash shell's)environnement, il ne sera pas développé. Mais je me suis trompé et ce n'est pas le cas, la réponse de Chris ci-dessus est juste.

Sachin Divekar
la source
2
Pas exactement. Essayez watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Down
+1 pour une réponse immédiate pour le vérifier. Je me suis trompé ci-dessus.
Sachin Divekar
@ChrisDown, donc même si watch utilise " sh -c", votre explication est applicable shaussi. Ai-je raison?
Sachin Divekar
1
Cela dépend de la coquille utilisée sh. Notez que cela fait le travail:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Bas
0

Avoir watchexécuté un nouveau shell interactif, qui développera l'alias:

watch -x bash -i -c ll

(Le -xbut est d'empêcher watchd'utiliser sa propre commande sh -cpour envelopper notre commande donnée. Nous ne le voulons pas car nous devons passer -ià shou bash, pour en faire un shell interactif, qui lit .bashrc et définit des alias. Avec -x, watch exécute le commande utilisant exec)

Gah, en fait, ça ne marche pas. Après avoir affiché la sortie de 'll' une fois, puis dormi 2 secondes, le travail se tâche en arrière-plan, avec le peu énigmatique:

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

Pourquoi cela s'est-il arrêté? Où est passé l'accolade [? Je pensais que ce serait une excellente réponse, mais je ne peux pas le faire fonctionner.

Jonathan Hartley
la source