Ist es möglich, eine Makro-Funktion in bash zu definieren, so, wenn ich schreibe:eine funktionsähnliche Makro in bash definieren
F(sth);
bash läuft dies:
echo "sth" > a.txt;
Ist es möglich, eine Makro-Funktion in bash zu definieren, so, wenn ich schreibe:eine funktionsähnliche Makro in bash definieren
F(sth);
bash läuft dies:
echo "sth" > a.txt;
Arbitrary Syntax kann nicht gemacht werden, etwas zu tun. Klammern sind Metazeichen, die eine besondere Bedeutung für den Parser haben, also gibt es keine Möglichkeit, sie als gültige Namen zu verwenden. Der beste Weg, die Shell zu erweitern, ist das Definieren von Funktionen.
Dies ist eine grundlegende echo
Wrapper sein würde, die immer auf die gleiche Datei schreibt:
f() {
echo "[email protected]"
} >a.txt
Dies macht das gleiche über, sondern zusätzlich Griffe stdin - opfern echo's
-e
und -n
Optionen:
f() {
[[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}"
} >a.txt
Das kann als
f arg1 arg2...
aufgerufen werden
oder
f <file
Funktionen werden in der gleichen Weise wie alle anderen Befehle übergebenen Argumente.
Der zweite echoähnliche Wrapper testet zunächst entweder set first argument oder stdin, die von einem nicht-tty kommen, und ruft printf unter Verwendung der Positionsparameter, falls gesetzt, oder stdin auf. Der Testausdruck vermeidet den Fall von Null-Argumenten und keine Umleitung von einer Datei. In diesem Fall würde Bash versuchen, die Ausgabe des Terminals zu erweitern, indem er die Shell aufhängt.
F() {
echo "$1" > a.txt
}
Sie don Verwenden Sie beim Aufruf keine Klammern. Dies ist, wie Sie es nennen:
F "text to save"
+1, nette Antwort. Würden Sie etwas genauer erklären, warum Sie dieses komplexere (aber bessere) Konstrukt verwenden, um das Argument (die Argumente) auszugeben? – Kaii
Es erlaubt nur die Eingabe von entweder stdin oder Argumente. Der Testausdruck verhindert eine Situation, in der es sowohl Nullargumente als auch Stdin gibt, die von einem Terminal kommen. In diesem Fall müsste die Shell gelöscht werden, da das Prozess-eigene tty gelesen und blockiert wird. Wenn dies der Fall ist, werden entweder die Positionsparameter erweitert, wenn sie gesetzt sind, oder die Erweiterung wird von der Funktionseingabe gelesen. Eine etwas portablere aber langsamere Lösung ist mit 'cat' möglich - dies erfordert ein System mit real/dev/fd/*. Ich habe gerade diesen Trick gepostet, da meine vorherige Antwort die gleiche war wie die der anderen. :) – ormaaj
auch, es erlaubt * mehrere Argumente * genau wie 'echo' tut. Ihre Funktion arbeitet mit 'f eins zwei drei', während die anderen nur mit' f "eins zwei drei" arbeiten. Bei einer gegebenen Eingabe ohne die Qotes würden die anderen Lösungen nur das erste Wort (hier: "Eins") berücksichtigen. – Kaii