2008-11-26 48 views
11

Tôi đang sử dụng GNU bash, phiên bản 3.00.15 (1) -release (x86_64-redhat-linux-gnu). Và lệnh này:echo "-e" không in bất cứ điều gì

echo "-e" 

không in bất kỳ thứ gì. Tôi đoán điều này là bởi vì "-e" là một trong các tùy chọn hợp lệ của lệnh echo vì echo "-n" và echo "-E" (hai tùy chọn còn lại) cũng tạo ra các chuỗi rỗng.

Câu hỏi đặt ra là làm thế nào để thoát chuỗi "-e" cho tiếng vọng để có được đầu ra tự nhiên ("-e").

Trả lời

12

Đây là một trong những khó khăn;)

Thông thường, bạn sẽ sử dụng dấu gạch ngang đôi nói với lệnh rằng nó nên dừng lại tùy chọn giải thích , nhưng tiếng vang sẽ chỉ ra những:

$ echo -- -e 
-- -e 

Bạn có thể sử dụng -e bản thân để có được xung quanh các vấn đề:

$ echo -e '\055e' 
-e 

Ngoài ra, như những người khác đã chỉ ra, nếu bạn không nhấn mạnh vào việc sử dụng bash BUILTIN echo, /bin/echo nhị phân của bạn có thể là phiên bản GNU của công cụ này (đánh dấu trang người đàn ông) và do đó hiểu được những biến POSIXLY_CORRECT môi trường :

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

Bạn có xảy ra cho biết, tại sao 'vang -e' làm không hoạt động từ Makefiles? –

+2

@dma_k: hoạt động cho tôi (tm). làm cho (1) không sử dụng nội dung $ SHELL bạn đang sử dụng, vì vậy nó sẽ hoạt động khác nhau. – hop

+0

Cảm ơn, tuyệt vời! Thật vậy, thiết lập 'SHELL =/bin/bash' trong Makefile đã giải quyết được vấn đề! –

4

Bạn có thể gian lận bằng cách làm

echo "-e " 

Đó sẽ là dấu gạch ngang, e, không gian.

Hoặc bạn có thể sử dụng phức tạp hơn, nhưng chính xác hơn:

echo -e \\\\x2De 
5

có thể có một cách tốt hơn, nhưng hoạt động này:

printf -- "-e\n" 
+0

Trong trường hợp này nó hoạt động nhưng nó không giải quyết vấn đề toàn cầu xem xét:. Printf "--version" – wheleph

+2

@wheleph Bạn đã bỏ qua "-" trước khi "-e \ n" .Điều này ngăn cách các tùy chọn từ các đối số. Đây là câu trả lời tốt nhất, di động (trên toàn bộ vỏ) +1. – richq

+0

@rq Có, tôi đã bỏ lỡ nó. 1 – wheleph

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

Chỉ cần 'POSIXLY_CORRECT = 1/bin/echo -e' (không có của) là đủ. Mặc dù điều này không sử dụng phiên bản BASH của tiếng vang –

+0

Thông tin về chế độ POSIX Bash: http://www.network-theory.co.uk/docs/bashref/BashPOSIXMode.html. Lệnh echo địa chỉ mục 41. Câu hỏi duy nhất còn lại cho tôi là lý do tại sao [root @ scintia mail] # POSIXLY_CORRECT = 1; xuất POSIXLY_CORRECT; echo "-e"; không hoạt động – wheleph

+0

Vinko, '/ bin/echo -e' cũng là đủ :) – wheleph

0

một cách khác:

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

tho nó ra nhiều hơn chỉ là "-e" under the hood :) –

1

Sau chú ý cẩn thận để xem man page :)

SYSV3=1 /usr/bin/echo -e 

công trình, trên Solaris ít nhất

+0

tôi đã không tìm thấy bất kỳ tài liệu tham khảo để biến env SYSV3 trong Linux trang người đàn ông echo – wheleph

+0

Dường như POSVLY_CORRECT env var từ một câu trả lời là tương đương? –

-2
/bin/echo -e 

công trình, nhưng tại sao?

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

Nếu bạn viết "echo -e", nó sử dụng bash internal bash, và viết "/ bin/echo -e" sử dụng lệnh external/bin/echo. Nhưng tôi Ubuntu 8.04 hộp không ai trong số hai phiên bản làm việc .. –

+2

'which' sẽ cho bạn biết hệ nhị phân sẽ được sử dụng, nhưng nó sẽ không nói nếu shell của bạn đã tích hợp sẵn chức năng cùng tên (mà sẽ có thể được sử dụng thay cho nhị phân). Bạn có thể sử dụng 'type' thay cho' which' để tìm thêm thông tin. – dreamlax

1

Một thay thế:

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

Đây là cách khuyến cáo của autoconf manual:

[...] Nó thường có thể tránh vấn đề này sử dụng 'echo "x $ word "', lấy' x 'vào tài khoản sau trong đường ống.

14

Một cách đúng để in bất kỳ chuỗi tùy ý:

printf "%s" "$vars" 
+0

+1 Câu trả lời hay nhất. – helpermethod

+0

Nó có đẹp không? Nhưng điều này sẽ không hoạt động cho các trình tự ANSI được nhúng, và phụ thuộc vào giá trị được gán. Hãy thử 'v =" $ (tput sgr0) "; printf "% s" "$ v" 'hoặc' v = $ (printf '\ 033 [4m'); printf "% s" "$ v" 'v.v. –

+0

@AndreasSpindler, nếu bạn muốn '% b' thay vì'% s' ... tốt, nó có sẵn trong tất cả các triển khai printf POSIX và cung cấp cho bạn xử lý chuỗi thoát giống như tìm thấy trong 'echo'. –

1

Tôi thích điều đó một cách sử dụng một herestring:

cat <<<"-e" 
Các vấn đề liên quan