2016-06-03 14 views
8

Wenn ich schreibe:bash "echo" einschließlich ">" in der Mitte der Erstellung der Datei - erklären Sie sich bitte

echo 2*3>5 is a valid inequality 

In meinem Bash-Terminal, eine neue Datei 5 Namen in meinem Verzeichnis erstellt, das enthält:

2*3 is a valid inequality 

Ich möchte wissen, was genau hier vor sich geht und warum bekomme ich diese Ausgabe? Ich glaube es ist offensichtlich, dass ich neu in Linux bin! Dank

+5

Verwenden Zitate: '$ echo "2 * 3> 5 ist eine gültige Ungleichung"' Ansonsten ist Ihr [Umleiten] (http://www.tldp.org/LDP/abs/html/io-redirection.html) der Ausgang – dawg

+2

nicht so offensichtlich. Ich benutze seit 15 Jahren Linux, ich hatte keine Ahnung, dass Sie die Weiterleitung bis jetzt irgendwo hinstellen konnten. – njzk2

+0

@ njzk2, POSIX erfordert nicht, dass es irgendwo anders als der Anfang oder das Ende unterstützt wird, aber * verbietet * solches Verhalten nicht; es ist also eine Bash-Erweiterung, aber eine vollkommen legale. –

Antwort

7

bash funktioniert die Umleitung der Ausgabe zuerst das heißt >5 zuerst gemacht wird und eine Datei mit dem Namen 5 erstellt (oder abgeschnitten, wenn es bereits vorhanden ist). Der resultierende Dateideskriptor bleibt für die Laufzeit des Befehls echo geöffnet.

Dann läuft der verbleibende Teil, 2*3 is a valid inequality, als Argument zu echo und Standardausgabe wird in der (bereits geöffneten) Datei 5 schließlich gespeichert.

Um den gesamten String als Ausgabe verwenden Sie einfache oder doppelte Anführungszeichen zu erhalten:

echo '2*3>5 is a valid inequality' 
12

In bash, Umleitungen können überall in der Zeile auftreten (aber Sie sollten es nicht tun! --- siehe the bash-hackers tutorial). Bash nimmt die >5 als eine Umleitung, erstellt die Ausgabedatei 5 und verarbeitet dann den Rest der Argumente. Daher passiert echo 2*3 is a valid inequality, was Ihnen die Ausgabe gibt, die Sie in der Ausgabedatei 5 sehen.

Was möchten Sie wahrscheinlich ist

echo "2*3>5 is a valid inequality" 

oder

echo '2*3>5 is a valid inequality' 

(mit einfachen Anführungszeichen), von denen wird Ihnen die Nachricht, die Sie als Ausdruck auf der Befehlszeile angeben. Der Unterschied besteht darin, dass innerhalb von "" Variablen (wie $foo) ausgefüllt werden, jedoch nicht innerhalb von ''.

bearbeiten: Die bash man page sagt, dass die

Umleitungsoperatoren überall in einem einfachen Befehl vor oder erscheinen kann oder einen Befehl folgen. Umleitungen werden in der Reihenfolge, in der sie angezeigt werden, von links nach rechts verarbeitet.

+2

Also, wenn ich richtig verstehe, ist es egal, wo ich '> Dateiname' setze! Das ist zu sagen: 'Befehl etwas Text> Dateiname etwas Text' wird die Ausgabe des Befehls, der ist ein Text ein bisschen Text hier, in einer Datei namens Dateiname, richtig ?? – secluded

+1

@secluded Ja, soweit ich weiß. Ich habe einen Verweis auf die man-Seite für weitere Details hinzugefügt. – cxw

3

Dies ist ein Beispiel für output redirection. Sie weisen die echo-Anweisung an, statt in den Standardausgang zu schreiben, in einen Dateinamen zu schreiben. Dieser Dateiname ist zufällig "5".

können Sie dieses Verhalten vermeiden, indem Sie zitieren:

echo "2*3>5 is a valid inequality"