2008-11-26 16 views
11

Używam GNU bash, wersja 3.00.15 (1) -release (x86_64-redhat-linux-gnu). A to polecenie:echo "-e" nie drukuje niczego

echo "-e" 

niczego nie drukuje. Chyba dlatego, że "-e" jest jedną z poprawnych opcji polecenia echo, ponieważ echo "-n" i echo "-E" (pozostałe dwie opcje) również tworzą puste ciągi.

Pytanie brzmi: jak uniknąć sekwencji "-e" dla echa, aby uzyskać naturalny wynik ("-e").

Odpowiedz

12

To jest trudne pytanie;)

Zazwyczaj należy użyć podwójnych kresek powiedzieć komendę, że powinien on powstrzymać możliwości interpretowania , ale echo będzie tylko wyjście ci:

$ echo -- -e 
-- -e 

można używać -e sobie obejść ten problem:

$ echo -e '\055e' 
-e 

Ponadto, jak inni zwrócili uwagę, jeśli nie domagać się za pomocą wbudowanego echo bash, plik binarny /bin/echo może być w wersji GNU narzędzia (sprawdź stronę man), a zatem zrozumieć zmienną środowiskową POSIXLY_CORRECT :

$ POSIXLY_CORRECT=1 /bin/echo -e 
-e 
+0

Czy ty przypadkiem wiem, dlaczego robi 'echo -e' nie działa z Makefiles? –

+2

@dma_k: działa dla mnie (tm). make (1) nie używa wbudowanego budki $ SHELL, więc zachowa się inaczej. – hop

+0

Dzięki, świetnie! Rzeczywiście, ustawienie 'SHELL =/bin/bash' w Makefile rozwiązało problem! –

4

Można oszukać wykonując

echo "-e " 

To byłoby kreska, e, przestrzeń.

Alternatywnie można użyć bardziej skomplikowane, ale bardziej precyzyjne:

echo -e \\\\x2De 
5

Nie może być lepszy sposób, ale to działa:

printf -- "-e\n" 
+0

W tym przypadku działa, ale nie rozwiązuje problemu globalnego. Rozważ: printf "--version" – wheleph

+2

@wheleph Zignorowałeś "-" przed "-e \ n" To oddziela opcje od argumentów Jest to najlepsza, przenośna (przez powłoki) odpowiedź +1. – richq

+0

@rq Tak, przegapiłem to. + 1 – wheleph

1
 
[[email protected] mail]# POSIXLY_CORRECT=1; export POSIXLY_CORRECT 
[[email protected] mail]# /bin/echo "-e" 
-e 
[[email protected] mail]# 
+0

Wystarczy "POSIXLY_CORRECT = 1/bin/echo -e" (bez tych). Chociaż nie używa się wersji BASH echa –

+0

Informacje o trybie Bash POSIX: http://www.network-theory.co.uk/docs/bashref/BashPOSIXMode.html. Element 41 zawiera komendę echo. Pozostaje mi tylko jedno pytanie: dlaczego [root @ scintia mail] # POSIXLY_CORRECT = 1; eksportuj POSIXLY_CORRECT; echo "-e"; nie działa – wheleph

+0

Vinko, '/ bin/echo -e' też wystarcza :) – wheleph

0

inny sposób:

echo -e' ' 
echo -e " \b-e" 
+0

tho wyprowadza więcej niż "-e" pod maską :) –

1

Po zwracając szczególną uwagę na stronie man :)

SYSV3=1 /usr/bin/echo -e 

prace, Solaris przynajmniej

+0

Nie znalazłem żadnych odniesień do zmiennej SYSV3 env w Linux echo man page – wheleph

+0

Wygląda na to, że POSIXLY_CORRECT env var z innej odpowiedzi jest odpowiednikiem? –

-2
/bin/echo -e 

działa, ale dlaczego?

[[email protected] ~]$ which echo 
/bin/echo 
+2

Jeśli napiszesz "echo -e", to używa wewnętrznego echa bash, a zapis "/ bin/echo -e" używa komendy external/bin/echo. Ale na moim systemie Ubuntu 8.04 nie działa żadna z dwóch wersji. –

+2

'który' powie ci, które binarne będą używane, ale nie powie, czy twoja powłoka ma wbudowaną funkcję o tej samej nazwie (która prawdopodobnie zostanie użyty zamiast binarnego). Możesz użyć 'type' zamiast' which', aby uzyskać więcej informacji. – dreamlax

1

Inną alternatywą:

echo x-e | sed 's/^x//' 

Jest to sposób zalecany przez autoconf manual:

[...] Często jest to możliwe, aby uniknąć tego problemu za pomocą „echo„x $ słowo "", biorąc pod uwagę "x" później w potoku.

14

Jedyny prawdziwy sposób wydrukować dowolną ciąg:

printf "%s" "$vars" 
+0

+1 Najlepsza odpowiedź imho. – helpermethod

+0

Czy nie byłoby miło? Ale to nie zadziała w przypadku osadzonych sekwencji ANSI Escape i zależy od tego, komu przypisano tę wartość. Wypróbuj 'v =" $ (tput sgr0) "; printf "% s" "$ v" 'lub' v = $ (printf '\ 033 [4m'); printf "% s" "$ v" 'itp. –

+0

@AndreasSpindler, jeśli chcesz '% b' zamiast'% s' ... cóż, jest on dostępny we wszystkich implementacjach printf POSIX i zapewnia tę samą obsługę sekwencji wyjścia, jak w 'echo'. –

1

lubię tamten używając herestring:

cat <<<"-e"