2012-11-06 15 views
11

Bardzo podobne to this question.echo "-n" nie drukuje -n?

Przejmuję kilka rzeczy za pomocą automatycznego skryptu w BASH. Sporadycznie skrypt natknie się na "-n", a echo spróbuje to zinterpretować.

Próba to:

$ POSIXLY_CORRECT=1 /bin/echo -n 

i

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

Ale to interpretować argument za każdym razem.

Następnie to, co działa, ale możliwe jest uderzanie znaków ze znakiem w łańcuchy, dlatego nie chcę stosować znaku pustego do wszystkich danych wejściowych i używać -e.

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

printf jest możliwe, ale należy unikać, chyba że nie ma żadnych innych opcji (nie wszystkie komputery mają printf jako narzędzie).

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

Czy istnieje sposób, aby uzyskać echo, aby wydrukować "-n"?

+1

A pytanie brzmi? – choroba

+0

Mój zły, zostawiłem to w tytule. Dodano do ostatniej linii. – MrDoom

+0

Stycznie spokrewniony, http://everything2.com/title/The+UNIX+i+Echo – tripleee

Odpowiedz

8

printf powinien być wbudowany we wszystkie twoje powłoki, chyba że niektóre z twoich maszyn mają bardzo stare wersje powłoki. Został wbudowany w bash przez długi czas. Prawdopodobnie jest bardziej przenośny niż echo -e.

W przeciwnym razie nie ma sposobu, aby uzyskać dostęp do opcji , o które się troszczy.

Edytuj: od an answer na inne podobne pytanie; unikać cytowania problemy z printf za pomocą tego wygodnego no-digital-praw-zatrzymane Wrapper:

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

(to ech-o, jak w "bez opcji")

+1

printf jest o wiele bardziej przenośny niż echo, ale pamiętaj, aby przekazać ciąg, który chcesz wydrukować jako argument, * nie * jako ciąg formatu (np. 'printf"% s \ n "" $ stringtoprint "' zamiast 'printf" $ stringtoprint \ n "') - patrz odpowiedź @ djhaskin987. –

+0

@GordonDavisson: Dodałem ouistycznie notatkę z innej mojej odpowiedzi, co uważam za dobre rozwiązanie. – rici

+3

Hah! +1 dla właściwego właściwego użycia '" $ * "' –

2

Jeśli powołać Bash nazwą sh , będzie naśladować sh, gdzie opcja -n nie była dostępna dla echo. Nie jestem pewien, czy to pasuje do twoich potrzeb.

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

To, że '-n' jest nieokreślone w specyfikacji polecenia powłoki POSIX.2 jest całkowicie nieprawdziwe. Opcjonalne (nie-łańcuchowe) zachowanie dla '-n' jest określane jako część standardowego zachowania (innego niż XSI) dla' echo'; to tylko powłoki implementujące opcjonalne rozszerzenia XSI tam, gdzie ich nie ma. Zobacz http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html - teraz, przyznane, _twoja_'/bin/sh' może być zgodne z XSI, ale nie jest to gwarantowane. –

4

Co o poprzedzenie ciąg ze znakiem "x" (na przykład), który zostanie usunięty on-the-fly z cięciem:

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

echo "-n" opowiada skorupę do wstaw "-n" jako pierwszy argument echa, znak postaci. Semantycznie, echo "-n" jest taki sam jak echo -n. Spróbuj zamiast tego (jest to standard POSIX i powinien działać na każdej powłoce):

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

echo "-n" nie drukuje -n ponieważ -n interpretowany jest jako opcja dla echo (patrz help echo).Ale można użyć: metoda

echo -e "\055n" 
+0

Jest to obsługiwane przez implementację 'echo' GNU, ale nie z żadną wersją zgodną z POSIX - implementacja" echa "zgodna z XSI wypisze literał' -e', a nie-XSI nie interpretować '\ 055'. Rzeczywiście, jeśli "wyeksportujesz POSIXLY_CORRECT = 1" w systemie GNU, zobaczysz poprzednie zachowanie. –

0

Oszukiwanie:

echo -e "\r-n" 
+0

... która działa, jeśli twoje dane wyjściowe są przeznaczone do spożycia przez ludzi, ale nie, jeśli mają być odczytywane przez program lub innego nieulotnego konsumenta. –

Powiązane problemy