2012-11-06 11 views
11

Sehr ähnlich to this question.echo "-n" wird nicht gedruckt -n?

Ich bin ein paar Dinge mit einem automatisierten Skript in BASH durchlaufen. Gelegentlich wird das Skript auf "-n" stoßen und echo wird versuchen, dies zu interpretieren.

Versuchte dies:

$ POSIXLY_CORRECT=1 /bin/echo -n 

und

$ POSIXLY_CORRECT=1 /bin/echo "-n" 

Aber es interpretiert die jedes Mal Argument.

Dann das, was funktioniert, aber es ist möglich, entkommene Zeichen in den Strings zu treffen, weshalb ich kein Nullzeichen auf alle Eingaben anwenden und -e verwenden möchte.

$ echo -e "\x00-n" 
-n 

printf ist möglich, aber ist zu vermeiden, es sei denn, es gibt keine anderen Optionen sind (Nicht alle Maschinen sind als Gebrauchs printf).

$printf "%s" "-n" 
-n 

So ist es eine Möglichkeit, Echo zu bekommen "-n" zu drucken?

+1

Und die Frage ist? – choroba

+0

Mein schlechtes, ließ es im Titel. Zur letzten Zeile hinzugefügt. – MrDoom

+0

Tangential verwandt, http://everything2.com/title/The+UNIX+und+the+Echo – tripleee

Antwort

8

printf sollte in all Ihren Shells eingebaut sein, es sei denn, einige Ihrer Maschinen haben sehr alte Shell-Versionen. Es ist seit langem in bash eingebaut. Es ist wahrscheinlich tragbarer als echo -e.

Ansonsten gibt es wirklich keine Möglichkeit, echo Optionen zu erhalten, die es interessiert.

Bearbeiten: von an answer zu einer anderen ähnlichen Frage; vermeiden zitiert Probleme mit printf durch mit diesem praktischen nicht-digital-Rechte-beibehalten Wrapper:

ech-o() { printf "%s\n" "$*"; } 

(Das ist ech-o, wie in "ohne Optionen")

+1

printf ist viel portabler als echo, aber stellen Sie sicher, dass Sie die Zeichenfolge übergeben, die Sie als Argument drucken möchten * nicht * als Formatzeichenfolge (zB 'printf"% s \ n "" $ stringtoprint "' anstelle von 'printf" $ stringtoprint \ n "') - siehe @ djhaskin987's Antwort. –

+0

@GordonDavisson: Ich habe egoistisch eine Notiz von einer anderen Antwort von mir hinzugefügt, die ich denke, ist eine nette Lösung. – rici

+3

Hah! +1 für eine tatsächliche angemessene Verwendung von "" $ * "' –

2

Wenn Sie aufrufen Bash mit dem Namen sh Es wird sh nachahmen, wo die -n Option echo nicht verfügbar war. Ich bin mir nicht sicher, ob das Ihren Bedürfnissen entspricht.

$ /bin/sh -c 'echo -n' 
+0

Dass "-n" in der Shell-Befehlsspezifikation POSIX.2 nicht angegeben ist, ist völlig falsch. Das Verhalten der Option (Nicht-String) für "-n" wird als Teil des Basisverhaltens (Nicht-XSI) für "echo" angegeben; Es sind nur Shells, die die optionalen XSI-Erweiterungen implementieren, wo sie nicht vorhanden sind. Siehe http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html - jetzt, gewährt, _ihr_ '/ bin/sh' kann XSI folgen, aber das ist nicht allgemein garantiert. –

4

Was die Zeichenfolge mit einem Zeichen über prefixing ("x" zum Beispiel), die mit einem Schnitt on-the-fly entfernt wird:

echo "x-n" | cut -c 2- 
3

echo "-n", um die Schale erzählt Setzen Sie '-n' als erstes Argument des Echos, Zeichen für Zeichen. Semantisch ist echo "-n" das gleiche wie echo -n. Versuchen Sie stattdessen (es ist ein Standard-POSIX und sollte auf jedem Shell arbeiten):

printf '%s\n' "-n" 
1

echo "-n" nicht -n weil -n interpretiert wird als Option druckt für echo (siehe help echo).Aber Sie können verwenden:

echo -e "\055n" 
+0

Dies wird mit der Implementierung von 'echo' von GNU unterstützt, aber nicht mit einer POSIX-konformen Version - eine XSI-konforme POSIX-Implementierung von 'echo' würde das Literal' -e' ausgeben, und eine Nicht-XSI-Datei würde dies nicht tun interpretiere das '\ 055'. In der Tat, wenn Sie POSIXLY_CORRECT = 1 auf einem GNU-System exportieren, sehen Sie das frühere Verhalten. –

0

Cheating Methode:

echo -e "\r-n" 
+0

... das funktioniert, wenn Ihre Ausgabe für den menschlichen Verzehr bestimmt ist, aber nicht, wenn es von einem Programm oder einem anderen nicht-terminalen Verbraucher gelesen werden soll. –

Verwandte Themen