J'utilise Ubuntu 10.04 et j'utilise upstart
pour la gestion des démons. Mon application d'entreprise est exécutée en tant que démon et doit être exécutée en tant que root en raison de divers privilèges. Par exemple:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Je voudrais introduire un alias
pour abréger ces commandes comme quelque chose comme:
alias startapp='sudo start my-application-long-ID'
et l'exécuter comme startapp
et cela fonctionne, mais je préférerais ne pas avoir sudo dans l'alias.
alias startapp='start my-application-long-ID'
ne fonctionne pas en utilisant sudo startapp
, en retournant sudo: startapp: command not found
.
Cependant, lorsque j'ai ajouté l'alias:
alias sudo='sudo '
sudo startapp
fonctionne maintenant mais je suis toujours curieux de savoir pourquoi sudo ignore les alias.
source ~/.bashrc
? Cela met à jour le fichier .bashrc et rend les nouveaux alias disponibles?Réponses:
Je vois les informations ci-dessous d' ici .
Lorsque vous utilisez sudo, utilisez l'extension d'alias (sinon sudo ignore vos alias)
La raison pour laquelle cela ne fonctionne pas est expliquée ici .
la source
Les alias et les fonctions sont définis dans un shell. Sudo est un programme externe. Donc sudo ne voit pas les alias, les fonctions ou les commandes internes du shell, seulement les commandes externes.
Les alias sont censés être des noms de commande alternatifs, donc les shells ne les développent qu'en position de commande, pas lorsqu'ils sont des arguments de commandes. Zsh prend en charge les alias globaux, qui sont développés n'importe où sur la ligne de commande, et à utiliser avec parcimonie car il existe un risque de les développer accidentellement même dans des contextes où l'alias n'a pas de sens.
Vous pouvez dire d'invoquer une sudo shell:
sudo sh -c '…shell command here…'
. Vos alias habituels ne seront cependant pas disponibles dans cette commande shell, car ils sont normalement stockés dans un fichier tel que~/.bashrc
ou~/.zshrc
qui n'est lu que par des shells interactifs.alias sudo='sudo '
, comme proposé par Ramesh , fait que le shell développe les alias aprèssudo
.la source
alias sudo='sudo '
fonctionne aussi pour ZSH?Une solution pour les utilisateurs de zsh
Dans bash et zsh, la fin d'un alias par un espace entraînera le shell à alias-développer le mot suivant. Cela permet à quelque chose comme ce qui suit de se développer alias
myalias
Malheureusement, cela tombe en morceaux lorsque vous avez plus d'un mot dans votre alias (comme
sudo -u someone
. Cependant, vous pouvez abuser de la fonction zsh "alias globaux" pour développer manuellement les alias n'importe où dans la commande.Cela crée un alias global appelé
$
(vous pouvez utiliser n'importe quel mot de votre choix) qui se termine par un espace. Cela provoque zsh à développer le mot suivant comme un alias de commande normal. Étant donné que l'alias se développe en espaces blancs, il ne sera pas traité comme un argument. Cela permet aux éléments suivants de fonctionner.Vous pouvez même utiliser
$
plusieurs fois sur une même ligne de commande si vous avez une imbrication de commandes compliquée. J'ai trouvé cela suffisamment utile pour qu'il ait une place permanente dans mon zshrc, cependant l'alias est assez simple pour définir quand vous devez l'utiliser.la source
Je viens de donner une réponse alternative ici sans redéfinir
sudo
avec un alias.Dans votre cas, ce serait:
Tout en une ligne, pas de coques supplémentaires, pas de redéfinitions d'alias. ;-)
la source
xargs
pour supprimer les guillemets, et grep pour supprimer le début=
. Un peu intelligent, mais probablement inutile.eval "sudo $(alias aliasname | cut -d= -f2-)"
est probablement mieux -xargs
ne gérera pas toujours les guillemets correctement, et il pourrait y en avoir plus d'un=
.xargs
ne supprime pas les guillemets. C'est grep qui prend la commande résolue entre les guillemets. Vous saveztype -a alias_name
renvoie quelque chose commealias_name is aliased to command_within_quotes
. Par la façon dont je l' ai essayé votre commande et n'a pas fonctionné sur mon ubuntu :-( Est - ce le retour de.type -a
Différent entre les versions linux (je doute)?.type
fait - enbash
. Vous comprenez cependant que les devis sont doublés non? L'avez-vous essayé avec un alias contenant des guillemets simples? Quoi qu'il en soit, vous avez raison de dire que mon truc ne fonctionne pas - vous avez besoin de l'uneval "sudo sh -c "$(...
ou de l' autreeval "'sudo $(alias alias_name| cut -d\' -f2-)"
. Le fait est que lesalias
es sont essentiellement pré-arrangéseval
- l'alias
utilitaire est spécifié pour sortir leur contenu afin qu'il puisse être réintroduit en toute sécurité dans le shell. Je suppose que votrexargs
est alors mis en œuvre pour aplatir l'espace blanc? Soyez juste prudent avec ça, ok?