Ich verwende Ubuntu 10.04 und verwende es upstart
für die Daemon-Verwaltung. Meine Unternehmensanwendung wird als Daemon ausgeführt und muss aufgrund verschiedener Berechtigungen als Root ausgeführt werden. Z.B:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Ich möchte einen einführen, alias
um diese Befehle als etwas abzukürzen:
alias startapp='sudo start my-application-long-ID'
und starte es so startapp
und das funktioniert aber ich würde es vorziehen kein sudo im alias zu haben.
alias startapp='start my-application-long-ID'
nicht bei lauf mit sudo startapp
, rückkehr sudo: startapp: command not found
.
Als ich jedoch den Alias hinzufügte:
alias sudo='sudo '
sudo startapp
Jetzt funktioniert, aber ich bin immer noch gespannt, warum Sudo Aliase ignoriert.
source ~/.bashrc
? Dadurch wird die .bashrc-Datei aktualisiert und die neuen Aliase verfügbar gemacht.Antworten:
Ich sehe die folgenden Informationen von hier .
Verwenden Sie bei Verwendung von sudo die Alias-Erweiterung (andernfalls ignoriert sudo Ihre Aliase).
Der Grund, warum es nicht funktioniert, wird hier erklärt .
quelle
Aliase und Funktionen werden in einer Shell definiert. Sudo ist ein externes Programm. Daher werden in sudo keine Aliase, Funktionen oder Shell-Builtins angezeigt, sondern nur externe Befehle.
Aliase sind als alternative Befehlsnamen gedacht, daher erweitern Shells sie nur an der Befehlsposition, nicht wenn es sich um Argumente für Befehle handelt. Zsh unterstützt globale Aliase, die an einer beliebigen Stelle in der Befehlszeile erweitert und am besten sparsam verwendet werden, da die Gefahr besteht, dass sie versehentlich erweitert werden, selbst in Kontexten, in denen der Alias keinen Sinn ergibt.
Sie können sudo sagen eine Shell aufzurufen:
sudo sh -c '…shell command here…'
. Ihre übliche Aliase nicht verfügbar innen sein , dass Shell - Befehl, jedoch, da sie normalerweise in einer Datei wie gespeichert~/.bashrc
oder~/.zshrc
die nur durch interaktiven Shells gelesen wird.alias sudo='sudo '
bewirkt , wie von Ramesh vorgeschlagen , dass die Shell Aliase danach erweitertsudo
.quelle
alias sudo='sudo '
für das ZSH?Eine Lösung für zsh-Benutzer
In Bash und Zsh bewirkt das Beenden eines Alias mit einem Leerzeichen, dass die Shell das nächste Wort mit einem Alias erweitert. Dies ermöglicht es, so etwas wie den folgenden Alias zu erweitern
myalias
Leider fällt dies auseinander, wenn Sie mehr als ein Wort in Ihrem Alias haben (wie
sudo -u someone
. Sie können jedoch die zsh-Funktion "Globale Aliase" missbrauchen, um Aliase an einer beliebigen Stelle im Befehl manuell zu erweitern.Dadurch wird ein globaler Alias erstellt
$
(Sie können ein beliebiges Wort verwenden), der in einem Leerzeichen endet. Dies bewirkt, dass zsh das nächste Wort als regulären Befehlsalias erweitert. Da der Alias zu Leerzeichen erweitert wird, wird er nicht als Argument behandelt. Dies ermöglicht Folgendes zu arbeiten.Sie können sogar
$
mehrere Male in einer Befehlszeile verwenden, wenn Sie eine komplizierte Befehlsverschachtelung haben. Ich fand das nützlich genug, dass es einen festen Platz in meinem zshrc hat, aber der Alias ist einfach genug, um zu definieren, wann Sie ihn verwenden müssen.quelle
Ich habe hier nur eine alternative Antwort gegeben , ohne sie
sudo
mit einem Alias neu zu definieren.In Ihrem Fall wäre es:
Alles in einer Zeile, keine zusätzlichen Shells, keine Alias-Neudefinitionen. ;-)
quelle
xargs
, um die Anführungszeichen zu entfernen, und grep, um die Führungszeichen zu entfernen=
. Ein bisschen schlau, aber wahrscheinlich unnötig.eval "sudo $(alias aliasname | cut -d= -f2-)"
ist wahrscheinlich besser -xargs
wird nicht immer mit den Anführungszeichen richtig umgehen, und es könnte mehr als eins=
geben.xargs
nicht die Anführungszeichen. Es ist grep, der den aufgelösten Befehl zwischen den Anführungszeichen entnimmt. Sie wissen,type -a alias_name
kehrt so etwas zurückalias_name is aliased to command_within_quotes
. Übrigens habe ich Ihren Befehl ausprobiert und auf meinem Ubuntu nicht funktioniert :-(. Ist es die Rückkehr vontype -a
verschiedenen Linux-Versionen? (Ich bezweifle es).type
- inbash
. Sie verstehen aber, dass die Anführungszeichen verdoppelt sind, oder? Haben Sie es mit einem Alias versucht, der einfache Anführungszeichen enthielt? Wie auch immer, Sie haben Recht damit, dass mein Ding nicht funktioniert - Sie brauchen entwedereval "sudo sh -c "$(...
odereval "'sudo $(alias alias_name| cut -d\' -f2-)"
. Die Sache ist, dassalias
es im Grunde voreingestellt isteval
- dasalias
Dienstprogramm ist darauf ausgelegt, ihren Inhalt auszugeben, damit er sicher wieder in die Shell eingegeben werden kann. Ich vermute, Siexargs
sind dann implementiert, um das Leerzeichen zu reduzieren? Sei einfach vorsichtig damit, ok?