Exécuter une commande masquée par un alias

164

Disons que j'ai l'alias suivant dans bash - alias ls='ls --color=auto'- et je veux appeler ordinaire lssans options. Est-ce que la seule façon de faire est de faire unalias, de faire la commande puis de nouveau alias? Ou il y a une astuce astucieuse ou une solution de contournement?

Mirzhan Irkegulov
la source
2
Juste une note sur certaines des réponses ci-dessous: "commande" est le SEUL moyen sûr d'accomplir cela. Par exemple, le "." ou "source" intégré peut être remplacé par une fonction définie par un script. "commande." ou "source de commande" est le seul moyen d'exécuter une source en toute sécurité, sans invoquer la fonction définie par le script. Aucune des autres alternatives, y compris la méthode de barre oblique inversée "\.", Ne fonctionne, et bien sûr, aucune alternative "/ bin / source" ne peut être appelée en spécifiant un chemin complet.
Dejay Clayton

Réponses:

211

Vous pouvez également préfixer une barre oblique inverse pour désactiver l'alias: \ls

Edit: D'autres manières de faire la même chose incluent:

Utilisez "commande": command lsselon Mikel .

Utilisez le chemin complet: /bin/lscomme par la suite .

Citez la commande: "ls"ou 'ls'selon le commentaire de Mikel.

Vous pouvez supprimer temporairement l'alias pour cette session de terminal avec unalias command_name.

Pas maintenant
la source
C'est ma façon habituelle de faire cela.
ncmathsadist
très agréable, fonctionne aussi bien avec tcsh
Levon
10
Cette façon est très utile. Il contourne uniquement les alias, pas les fonctions, ce qui le rend différent de commandou builtin.
Mikel
1
Il semble que l\sfait la même chose. Ce comportement est-il un bug ou une fonctionnalité?
Niklas B.
4
C'est une "fonctionnalité". Seuls les alias non cités sont développés. Vous pouvez donc le mettre entre guillemets ou utiliser une barre oblique inverse où vous le souhaitez. Voir la référence des alias bash .
Mikel
79

C'est ce que la commandcommande est pour.

Essayer

command ls

Cela indique au shell de contourner les alias et les fonctions.

Cette méthode est supportée par bash , zsh et ash / dash.

Mikel
la source
2
Meilleure réponse, pourquoi n'est-ce pas le plus voté? :) +1
0xC0000022L
11
Parce qu'elle ajoute 8 fois le nombre de caractères de la méthode antislash
JoelFan
1
@STATUS_ACCESS_DENIED Cela ne fonctionne pas non plus avec tcsh (et donc probablement pas avec csh non plus). La méthode `\` fait
Levon
3
La fonction barre oblique inverse n'est pas sécurisée. Bien qu'il offre une protection contre les alias de même nom, il ne protège pas contre les fonctions de même nom.
Dejay Clayton
2
@ JoelFan Je préférerais de beaucoup avoir les quelques caractères supplémentaires et que mes scripts soient faciles à suivre et fonctionnent pour tout le monde. Plutôt qu'une barre oblique cryptée qui n'est pas intuitive, facile à manquer, pas bien documentée et qui ne fonctionne pas pour contourner des fonctions.
Dennis
19

L'alias n'est qu'un raccourci défini. Dans cet exemple, l'alias défini est la chaîne lsqui s'exécute ls --color=auto. Si vous ne voulez pas ce comportement, vous pouvez appeler le binaire en lsutilisant le chemin absolu.

Donc, exécuter /bin/lsva produire une sortie sans couleur car ce n'est pas l'alias que vous avez défini.

Vous pouvez également changer l'alias en quelque chose de différent ou ajouter un nouvel alias qui s'exécute lssans les paramètres de couleur.

George M
la source
2
Vous devez savoir où se trouve la commande. Sur certains systèmes, la division entre /binet /usr/binest arbitraire.
Keith Thompson
@KeithThompson Pour cela, vous pouvez utiliser whichpour certaines commandes: which ls.
cst1992
@ cst1992: Si vous utilisez which(ou type), il effectue une recherche via $PATH; vous pouvez aussi bien utiliser lsou \lsplutôt que spécifier le chemin.
Keith Thompson le
10

Une autre façon, en s'appuyant sur la réponse de @ uther, consiste à utiliser $(which ...)ou `which ...`(à l'aide de backticks ``) pour trouver automatiquement le chemin de l'exécutable. Cela fonctionnera dans bash:

$(which ls)

`which ls`

Sans aucun doute, il \est beaucoup plus court de préfixer la commande avec un .

UPDATE : Selon Comment utiliser `which` sur une commande avec alias? , cela ne semble pas du tout fiable.

krlmlr
la source
A quoi servent les crochets? Je suppose que vous voulez `which ls`exécuter le binaire directement.
Amyassin
2
@amyassin: les deux syntaxes sont équivalentes. (BTW, comment avez-vous obtenu les backticks dans le formatage du code?)
krlmlr
En fait, cela (which ls)n’a pas fonctionné pour moi (sur Ubuntu 12.04 LTS). Et les backticks étaient difficiles, je leur ai échappé: \ ’ls \ '. Il a fallu beaucoup de montage pour y arriver :)
amyassin
1
@ user946850 "Pour inclure un caractère de pièce de retrait littérale dans une plage de code, vous pouvez utiliser plusieurs pièces de retour en tant que délimiteurs d'ouverture et de fermeture". Source: Référence Markdown .
Mikel
@amyassin: Avez-vous ajouté le $?
krlmlr
2

Personnellement, j'évite simplement de définir des alias avec les mêmes noms que les commandes, invoquez donc lstoujours la commande réelle. J'ai alias ou fonctions pour diverses combinaisons d'options telles que l, llet lg. (Cela signifie que j'ai besoin unalias lsde mon .bashrcou .cshrc.)

Je trouve que les hypothèses de l'OS concernant les options que je pourrais préférer (outrepassant les hypothèses des concepteurs de la lscommande elle-même) correspondent rarement à mes goûts personnels. Je n'aime pas le look de ls --color=auto, et sa lisibilité peut varier considérablement entre noir sur blanc et blanc sur noir.

YMMV, et les autres solutions sont bien sûr toujours intéressantes à connaître.

Keith Thompson
la source
1

Taper la commande en majuscule semble fonctionner LS, mais je ne sais pas trop pourquoi.

Asmeurer
la source
4
Dans quel shell, quel système d'exploitation, quel terminal, etc.?
Mikel
@ Mikel Il existe un paquetage "sl" qui fournit "sl" en tant que "ls". Les conseils donnés par bash dans Ubuntu indiquent également que "LS" est fourni par "sl".
Izkata
1
Ceci est bash 4 (installé avec Fink) sous Mac OS X 10.7. Cela fonctionne également pour d'autres commandes que j'ai aliasées comme rm et grep.
Asmeurer
3
C'est juste une blague :) de la page mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin
7
Je pense que cela fonctionne pour Mac OS X car son système de fichiers est insensible à la casse par défaut. Cela ne fonctionnera pas sur d'autres Unix.
Jander