Existe-t-il un moyen simple de répertorier tous les conflits de commandes qui se sont produits dans le système en raison de la mise à jour bashrc impliquant des commandes d'alias?
Par exemple, quelqu'un écrit alias ls=/path/to/user-generated/executable
en bashrc. Comment découvre-t-on que cela masque une commande réelle ( ls
). Une façon semble être d'exécuter tous les alias avant et après le sourcing bashrc et de différencier la sortie. Y a-t-il de meilleures façons?
J'utilise Ubuntu 12.04.
bash --version
GNU bash, version 4.2.24 (1) -release (i686-pc-linux-gnu)
Réponses:
Pour savoir quelles commandes sont masquées par les alias, procédez comme suit:
Explication
alias
seul répertorie les alias définis etsed
extrait leur nom. La boucle while s'exécutetype -ta
sur chacun d'eux etawk
imprime les lignes qui contiennent à la fois l'alias et le fichier.la source
Vous pouvez utiliser
type
pour découvrir comment une commande serait interprétée par bash.la source
type ls
imprimels is aliased to `ls --color=auto'
ici.which
, mais je ne le fais pas maintenant si les deux (type, qui) commandes internes du shell sont les mêmes.type which
vous le ditwhich is /usr/bin/which
, ce n'est donc pas une fonction intégrée. Par conséquent, il ne peut pas vous dire si quelque chose est intégré ou non (par exemplewhich echo
versustype echo
).type which
which is a shell builtin
j'utilise le zsh.Comme première question, il n'y a aucun moyen de lister les conflits, puisque bash utilise une table de hachage en interne, il n'enregistre que le dernier remplacement.
Pour savoir si une commande est un alias, utilisez
alias ls
dans votre cas, si elle vous dit quelque chose comme "non trouvé" alors ce n'est pas un alias, sinon c'est le cas.Pour lancer la fonction originale sans tenir compte de l'alias, préfixez une barre oblique, par exemple
\ls
lancera le vrai ls haché, ignorez l'alias.ÉDITER
Si vous voulez savoir rapidement si une commande est un alias, vous pouvez activer le mode de débogage par
set -x
, maintenant si vous exécutezls
:Vous verrez une sortie de débogage de la vraie commande en cours d'exécution
Pour désactiver le mode de débogage, utilisez
set -
la source
alias
rôle. Que faire si un utilisateur ne sait pas qu'il existe une commande (par exemplels
)? La seule chose qu'il semble savoir après avoir couru,alias ls
c'est à quoi il est mappé et non à quoi il a été mappé à l'origine. Je suppose que l'on devra exécuter toutes les commandes avec et sans \ pour trouver des conflits.Vous pouvez utiliser la commande bash intégrée
compgen
pour obtenir une liste de toutes les commandes et de tous les alias utilisantcompgen -ac
. Toute commande qui est également un alias sera dupliquée dans cette liste, donc la solution naïve simple consiste à rechercher des doublons dans la sortie decompgen -ac
.Cependant, des doublons peuvent également apparaître si une commande se trouve sur le chemin deux fois. Par exemple, je l'ai
/bin/which
et je vais/usr/bin/which
donccompgen -ac
énumérerwhich
deux fois, même s'il ne s'agit pas d'un alias.Il faut donc obtenir tous les doublons
compgen -ac
et les comparer à une liste d'alias. Seuls les doublons qui sont également des alias sont ceux qui masquent les commandes. Nous pouvons le faire avec lacomm(1)
commande et avec la substitution de processus bash.compgen -a | sort
est la liste de tous les alias (triés pourcomm
).compgen -ac | sort | uniq -d
est la liste de tous les doublons de la liste des commandes et des alias.comm -12
ne produit que les lignes communes aux deux.la source
Vous pouvez utiliser la fonction de débogage du shell pour voir exactement ce qui se passe lorsque bash appelle un shell interactif. Les éléments suivants devraient vous montrer tous les alias attribués lorsqu'un shell interactif est généré à partir d'un shell de connexion:
-x
-> activer le débogage-l
-> shell de connexion-i
-> shell interactif-c
-> commandeL'exécution de la commande exit est nécessaire pour que le shell revienne. Le
-i
est requis dans ce cas car bash ne configurerait pas un environnement interactif pour exécuter une commande autrement.Voici un exemple de mon système:
Afin de voir quel fichier a été généré pour la dernière fois lorsque l'alias a été affecté pour déterminer le fichier sur lequel il s'est produit, vous pouvez étendre le grep:
Cela peut renvoyer des faux positifs, mais cela devrait être correct si vous inspectez manuellement les données renvoyées. Le nombre de symboles «+» devant la commande exécutée indique la profondeur.
Dans cet exemple de sortie, il montre que .bashrc définit un alias pour
ls
, .foo aliast
, puis .bashrc remplace l'alias précédent det
.la source