Machen Sie sich ein Bash-alias, das einen parameter nimmt?
Ich verwendet, um zu verwenden CShell (csh), mit dem Sie ein alias, das einen parameter nimmt. Die notation wurde so etwas wie
alias junk="mv \\!* ~/.Trash"
In der Bash, scheint dies nicht zu funktionieren. Da die Bash eine Vielzahl von nützlichen Funktionen, würde ich davon ausgehen, dass dieser umgesetzt worden ist, aber ich Frage mich, wie.
InformationsquelleAutor der Frage Hello | 2011-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bash-alias nicht direkt die Parameter akzeptieren. Sie müssen eine Funktion erstellen und alias.
alias
akzeptiert keine Parameter, sondern eine Funktion aufgerufen werden kann wie ein alias. Zum Beispiel:Durch die Art und Weise, Bash definierten Funktionen in Ihrem
.bashrc
- und andere Dateien sind als Befehle in der shell. So zum Beispiel können Sie die frühere Funktion wie dieseInformationsquelleAutor der Antwort arunkumar
Verfeinerung der Antwort oben, kann man 1-line-syntax, wie Sie für Aliase, die bequemer für ad-hoc-Definitionen in einer Schale oder .bashrc-Dateien:
Vergessen Sie nicht das Semikolon vor der schließenden rechten Klammer. Ebenso sind für die eigentliche Frage:
Oder:
InformationsquelleAutor der Antwort Mike Gleason
Die Frage ist einfach falsch gefragt. Sie sind nicht ein alias-Parameter benötigt, weil
alias
fügt nur ein zweiter name für etwas, das bereits existiert. Die Funktionalität der OP will, ist diefunction
Befehl zum erstellen einer neuen Funktion. Sie brauchen nicht zu alias-die Funktion die Funktion schon einen Namen hat.Ich denke, Sie wollen so etwas wie dieses :
Das ist es! Sie können mit den Parametern $1, $2, $3, etc, oder einfach nur Sachen, die Sie alle mit $@
InformationsquelleAutor der Antwort Evan Langlois
TL;DR: dies anstelle
Seine weit leichter und besser lesbar zu verwenden eine Funktion als eines alias zu setzen, Argumente, die mitten in einem Befehl.
Wenn Sie weiterlesen, erfahren Sie Dinge, die Sie brauchen nicht zu wissen, über die shell-argument-Verarbeitung. Wissen ist gefährlich. Nur das Ergebnis erhalten, die Sie wollen, bevor die dunkle Seite für immer steuert Ihr Schicksal.
Klärung
bash
Aliase tun Argumente akzeptieren, aber nur an der Ende:Putting-Argumente in den Mitte der Befehl über
alias
ist in der Tat möglich, aber es wird hässlich.Versuchen Sie nicht dieses zu Hause, kiddies!
Wenn Sie wie die Umgehung von Einschränkungen und tun, was andere sagen, ist unmöglich, hier das Rezept. Nur nicht mir die Schuld, wenn Ihr Haar wird zerfetzt und Ihr Gesicht landet mit Ruß bedeckt mad-scientist-Stil.
Die Problemumgehung ist die übergabe der Argumente, die
alias
akzeptiert, nur am Ende, um einen wrapper, legen Sie Sie in der Mitte und führen Sie dann den Befehl.Lösung 1
Wenn Sie wirklich gegen eine Funktion verwenden, die per se, die Sie verwenden können:
Können Sie ersetzen
$@
mit$1
wenn Sie möchten, dass nur das erste argument.Erläuterung 1
Dieser erstellt eine temporäre Funktion
f
die übergeben wird, werden die Argumente (beachten Sie, dassf
heißt ganz am Ende). Dieunset -f
entfernt die definition einer Funktion wie der alias ausgeführt wird, so dass es nicht zu hängen, um danach.Lösung 2
Können Sie auch eine subshell:
Erläuterung 2
Den alias baut ein Befehl wie:
Kommentare:
Den Platzhalter
_
erforderlich ist, aber es könnte alles sein. Es wird festgelegtsh
's$0
und ist erforderlich, so dass der erste der vom Benutzer angegebenen Argumente nicht bekommen verbraucht. Demonstration:Den einfachen Anführungszeichen innerhalb von einfachen Anführungszeichen sind erforderlich. Hier ist ein Beispiel, es funktioniert nicht mit double quotes:
Hier die Werte der interaktiven shell
$0
und$@
ersetzt, die in den doppelten Anführungszeichen vor es übergeben wird, umsh
. Hier der Beweis:Die Anführungszeichen stellen sicher, dass diese Variablen werden nicht interpretiert, die durch interaktive shell, und sind vergangen, buchstäblich zu
sh -c
.Könnten Sie doppelte Anführungszeichen und
\$@
aber am besten nennen Sie Ihre Argumente (wie Sie auch Leerzeichen enthalten kann), und\"\$@\"
sieht sogar noch hässlicher, aber kann Ihnen helfen, zu gewinnen eine Verschleierung Wettbewerb, wo frazzled Haar ist eine Voraussetzung für die Einreise.InformationsquelleAutor der Antwort Tom Hale
Alternative Lösung ist die Verwendung markerein tool habe ich erst vor kurzem erstellt, in dem Sie "Lesezeichen" den Befehl Vorlagen und leicht zu plazieren Sie den cursor auf den Befehl Platz-Inhaber:
Fand ich, dass die meisten der Zeit, ich bin mit shell-Funktionen, damit ich nicht schreiben muss Häufig verwendete Befehle wieder und wieder in der Befehlszeile. Die Frage der Verwendung von Funktionen für diesen Anwendungsfall ist das hinzufügen neuer Ausdrücke, die meinem Kommando Wortschatz und daran erinnern, was für Funktionen Parameter finden Sie in der real-Befehl. Marker Ziel ist die Beseitigung, die psychische Belastung.
InformationsquelleAutor der Antwort Amine Hajyoussef
Hier sind drei Beispiele für Funktionen, die ich in meinem
~/.bashrc
sind im wesentlichen Aliase akzeptiert einen parameter:.
.
.
Referenzen:
InformationsquelleAutor der Antwort aliteralmind
NB: falls die Idee nicht offensichtlich ist, ist es eine schlechte Idee, verwenden Sie Aliase für alles, sondern Aliase, die erste ist die 'Funktion in alias' und die zweite als "schwer zu Lesen redirect/source'. Auch gibt es Mängel (die ich dachte wäre naheliegend, aber nur für den Fall, dass Sie verwirrt sind: ich meine nicht Sie tatsächlich genutzt werden können... überall!)
................................................................................................................................................
Ich beantwortet haben, bevor, und es war schon immer so in der Vergangenheit:
das ist in Ordnung und gut, es sei denn, Sie sind die Vermeidung der Verwendung von Funktionen, alle zusammen. in dem Fall können Sie die Vorteile von bash große Fähigkeit zu redirect text:
Beide sind etwa die gleiche Länge geben oder nehmen ein paar Zeichen.
Den real kicker ist der Zeit Unterschied, die top '- Funktion-Methode "und in der unteren die "redirect-source' - Methode. Um zu beweisen, diese Theorie, das timing spricht für sich:
Dies ist der untere Teil der etwa 200 Ergebnisse, erfolgt in unregelmäßigen Abständen. Es scheint, dass die Funktion für die Erstellung/Zerstörung mehr Zeit in Anspruch nimmt als Umleitung. Hoffentlich wird dies helfen, die künftigen Besucher zu dieser Frage (wollte nicht für mich behalten).
InformationsquelleAutor der Antwort osirisgothra
Für die Aufnahme-Parameter, die Sie verwenden sollten Funktionen!
Jedoch $@ get interpretiert beim erstellen des alias, statt des während der Ausführung der alias und die Flucht des $ funktioniert auch nicht. Wie löse ich dieses problem?
Müssen Sie die Verwendung von shell-Funktion anstelle des alias, um loszuwerden, dieses problem. Sie können festlegen, foo wie folgt:
ODER
Schließlich rufen Sie Ihre foo() mit der folgenden syntax:
Stellen Sie sicher, fügen Sie Ihre foo ()
~/.bash_profile
oder~/.zshrc
Datei.In Ihrem Fall, wird diese Arbeit
InformationsquelleAutor der Antwort Ahmad Awais
Berechtigten technischen Gründen zu wollen, eine verallgemeinerte Lösung für das problem der bash-alias nicht mit einem Mechanismus zu nehmen, eine reposition beliebige Argumente. Ein Grund dafür ist, wenn der Befehl, den Sie ausführen wollen würde negativ beeinflusst werden durch die änderungen der Umwelt, die durch eine Funktion auszuführen. In allen anderen Fällen sollten Funktionen verwendet werden.
Was vor kurzem mich gezwungen, zu versuchen eine Lösung zu diesem ist, dass ich wollte, um einige abgekürzte Befehle für den Druck der Definitionen von Variablen und Funktionen. Also schrieb ich einige Funktionen für diesen Zweck. Allerdings gibt es bestimmte Variablen, die sind (oder werden kann) geändert werden, indem eine Funktion sich selbst aufrufen. Unter Ihnen sind:
FUNCNAME
BASH_SOURCE
BASH_LINENO
BASH_ARGC
BASH_ARGV
Den basic-Befehl, den ich hatte (in Funktion) print variable defns. in der Ausgabe des Formulars durch den set-Befehl war:
E. g.:
Problem: Das wird nicht gedruckt, die Definitionen der Variablen, die oben erwähnt werden, da Sie in der aktuellen Kontextz.B., wenn in einer interaktiven shell-prompt (oder nicht in jeder function calls), FUNKTIONSNAME ist nicht definiert. Aber meine Funktion sagt mir die falschen Informationen:
Einer Lösung kam ich mit erwähnt wurde, von anderen in anderen Beiträgen zu diesem Thema. Für diesen spezifischen Befehl zum drucken variabler defns., und die erfordert nur ein argument, habe ich dies getan:
Gibt den richtigen Ausgang (keine), und Ergebnis-status (false):
Aber ich fühlte sich gezwungen, eine Lösung zu finden, das funktioniert für eine beliebige Anzahl von Argumenten.
Eine Allgemeine Lösung Für Beliebige Argumente Übergeben, Um Ein Bash-Alias-Befehl:
E. g.:
Eine schöne an dieser Lösung ist, dass alle Spezial-tricks für den Umgang mit positions-Parameter (Argumente) zu Befehlen, die arbeiten beim Komponieren des gefangen-Befehl. Der einzige Unterschied ist, dass die array-syntax verwendet werden muss.
E. g.,
Wenn du willst "$ @ " "${CMD_ARGV[@]}".
Wenn du willst"$#", "${#CMD_ARGV[@]}".
Etc.
InformationsquelleAutor der Antwort crobc1
Wenn Sie suchen für eine generische Methode für alle Parameter die an eine Funktion, nicht nur ein oder zwei oder einige ähnliche Menge, die Sie tun können, auf diese Weise:
Also im Beispiel oben, ich lasse alle Parameter aus, wenn ich
runjar
zu den alias.Zum Beispiel, wenn ich
runjar hi there
würde es am Ende tatsächlich läuftjava -jar myjar.jar hi there
. Wenn ichrunjar one two three
es laufen würdejava -jar myjar.jar one two three
.Ich mag diese
$@
- basierte Lösung, denn es funktioniert mit einer beliebigen Anzahl von Parametern.InformationsquelleAutor der Antwort Micah
Funktionen sind ja fast immer die Antwort wie bereits reichlich beigetragen und bestätigt dieses Zitat aus der man-page: "Für fast jeden Zweck, Aliase werden ersetzt durch shell-Funktionen."
Vollständigkeit halber und weil dies kann nützlich sein (unwesentlich mehr leichte syntax) es konnte festgestellt werden, dass, wenn die parameter(s) Folgen Sie den alias, können Sie immer noch verwendet werden (obwohl dies ja wohl nicht um die OP ' s Anforderung). Dies ist wahrscheinlich am einfachsten an einem Beispiel demonstrieren:
ermöglicht es mir, zu geben smth like
ssh_disc myhost
die wird erweitert, wie erwartet:ssh -O stop myhost
Dies kann nützlich sein, für Befehle, die komplexe Argumente (mein Gedächtnis ist nicht das, was es t mehr...)
InformationsquelleAutor der Antwort sxc731
Ihnen jedoch nicht benötigen Funktionen beim erstellen von Aliasen in
.bashrc
- Datei.Zum Beispiel
Nach der änderung in der .bashrc-Datei, stellen Sie sicher, geben Sie den folgenden Befehl aus.
Sollten Sie in der Lage sein, diese zu verwenden, wie so
InformationsquelleAutor der Antwort kaizer1v