sudo
Kürzlich habe ich erfahren, dass Sie benutzerdefinierte Aliase wie folgt aktivieren können :
alias sudo='sudo ' # note: the space is required!
Der Grund, warum das funktioniertist das Folgende:
Wenn das letzte Zeichen des Alias-Wertes ein Leerzeichen oder ein Tabulatorzeichen ist, wird auch das nächste Befehlswort nach dem Alias auf Alias-Erweiterung überprüft.
Meine Frage lautet: Gibt es eine Möglichkeit, dies sudo
auch mit benutzerdefinierten Funktionen zu aktivieren?
Antwort1
Im Allgemeinen funktioniert das, was Sie versuchen, nicht wirklich.
Bei Aliasnamen erfolgt im Wesentlichen lediglich eine Umschreibung der Zeichenfolge, bevor die Zeile zur Ausführung übergeben wird.
Wenn Sie beispielsweise
alias sudo='sudo '
alias foo='bar baz'
dann, wenn Sie sudo foo
die Befehlszeile eingeben wird umgeschrieben sudo bar baz
undDaswird dann ausgeführt. Dies ist eine einfache Umschreibung der Befehlszeile.
Jetzt sind Funktionen schwieriger. Sie sind keine einfachen Umschreibungen, sondern eine vollständige Auswertung; sie können Variablen setzen, Verzeichnisse ändern, Dateien öffnen... so ziemlich allesirgendetwasdie Shell kann. Und, was wichtig ist, sie werden im Kontext der aktuellen Shell ausgeführt. Wenn Sie ausführen, sudo myfunction
ist nichts davon möglich; insbesondere sudo
werden Befehle als Unterprozess ausgeführt und können daher die aktuelle Shell nicht beeinflussen.
Die Problemumgehung für Dinge wie die sudowrap
oben genannten besteht darin, zu versuchen, automatisch zu arbeiten sudo bash -c 'myfunction() {...} ; myfunction'
. Dies ruft explizit eine neue bash
Subshell auf und führt dann die Funktion in dieser Subshell aus. Der explizite Aufruf macht deutlich, dass Dinge wie das Setzen von Variablen und dergleichen nicht funktionieren :-) Es ermöglicht eine begrenzte Teilmenge der Funktionalität.
Die Art von Funktionen, die Sie auf diese Weise aufrufen können, lassen sich besser als Shell-Skripte statt als Funktionen umschreiben. Dann sudo
können Sie sie direkt aufrufen. Das Beispiel unterhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlwäre einfacher, wenn man duk
es in eine ausführbare Datei konvertiert hätte
#!/bin/bash
exec du -k "$@" | sort -n
Dann klappt es wie erwartet!