2012-04-17 3 views

Antwort

14

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.

+0

+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

+0

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

+0

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

4
F() { 
    echo "$1" > a.txt 
} 

Sie don Verwenden Sie beim Aufruf keine Klammern. Dies ist, wie Sie es nennen:

F "text to save" 
3

Ja, nur sollten Sie es mit F sth nennen:

F() 
{ 
    echo "$1" > a.txt 
} 

mehr here lesen.

Verwandte Themen