2010-12-14 16 views
23

Tôi đã đọc các trang của người đàn ông trên echo, và nó cho tôi biết rằng tham số -e sẽ cho phép một ký tự thoát, chẳng hạn như một n thoát cho dòng mới, để có ý nghĩa đặc biệt của nó. Khi tôi gõ lệnhđầu ra echo -e tham số trong các tập lệnh bash. Làm thế nào tôi có thể ngăn chặn điều này?

$ echo -e 'foo\nbar' 

vào một vỏ bash tương tác, tôi nhận được sản lượng dự kiến:

foo 
bar 

Nhưng khi tôi sử dụng lệnh này tương ứng (i đã cố gắng nhân vật lệnh này cho nhân vật như một trường hợp thử nghiệm) tôi nhận được kết quả như sau:

-e foo 
bar 

đó là nếu tiếng vang được interpretting -e như một tham số (vì newline vẫn xuất hiện) nhưng cũng nó diễn giải các -e như là một chuỗi để ec ho. Những gì đang xảy ra ở đây? Làm thế nào tôi có thể ngăn chặn -e hiển thị?

+0

Tôi đang chạy Ubuntu Lucid 10.04 trong trường hợp này là rất quan trọng –

+0

mà tiếng vang bạn đang sử dụng? gõ 'mà echo' trên dòng lệnh. –

+0

Hóa ra tôi đã sử dụng phiên bản 'Bourne Shell' trong các kịch bản của mình nhưng phiên bản Bash trong phiên bản tương tác. –

Trả lời

28

Bạn cần sử dụng #!/bin/bash làm dòng đầu tiên trong tập lệnh của mình. Nếu không, hoặc nếu bạn sử dụng #!/bin/sh, tập lệnh sẽ do trình bao Bourne điều hành và echo của nó sẽ không nhận ra tùy chọn -e. Nói chung, tất cả các tập lệnh mới đều sử dụng printf thay vì echo nếu tính di động là quan trọng.

Trong Ubuntu, sh được cung cấp bởi liên kết tượng trưng đến /bin/dash.

+0

Ồ thôi. Tôi đã có! #/Bin/sh, rõ ràng đang chạy ở Bourne nhưng vỏ tương tác của tôi là Bash. Chúc mừng. –

+0

+1. Đã lưu nhật ký của tôi từ một số sự xấu xí nhất định ngay cả sau 7 tháng – Vlueboy

+0

cách giải quyết cùng một vấn đề trong python? Tôi muốn in os.system ("echo -e '\ x41'") nhưng nó có cùng vấn đề –

3

Triển khai khác nhau của echo hoạt động theo những cách khác nhau. Một số không có các tùy chọn (tức là chỉ đơn giản là echo -e khi bạn mô tả) và tự động giải thích các chuỗi thoát trong các thông số của chúng. Một số có cờ và không diễn giải thoát trừ khi được đặt cờ -e. Một số có cờ và giải thích các chuỗi thoát khác nhau tùy thuộc vào việc cờ -e đã được chuyển. Một số sẽ khiến bạn xé tóc ra nếu bạn cố gắng khiến họ cư xử theo cách có thể dự đoán được ... oh, đợi đã, đó là tất cả.

Điều bạn có thể thấy ở đây là sự khác biệt giữa phiên bản echo được tích hợp vào bash/bin/echo hoặc có thể so với nội trang khác của vỏ. Điều này bit tôi khi Mac OS X v10.5 vận chuyển với một xây dựng bash echo mà lặp lại cờ, không giống như những gì tất cả các kịch bản của tôi mong đợi ...

Trong mọi trường hợp, có một giải pháp: sử dụng printf thay thế. Nó luôn diễn giải các chuỗi thoát trong đối số đầu tiên của nó (chuỗi định dạng). Các vấn đề là nó không tự động thêm một dòng mới (vì vậy bạn phải nhớ làm điều đó một cách rõ ràng), và nó cũng giải thích các chuỗi % trong đối số đầu tiên của nó (sau khi tất cả, một chuỗi định dạng). Nói chung, bạn muốn đặt tất cả các công cụ định dạng trong chuỗi định dạng, sau đó đặt các chuỗi biến trong phần còn lại của các đối số để bạn có thể kiểm soát cách chúng được diễn giải theo định dạng % bạn sử dụng để nội suy chúng thành đầu ra. Một số ví dụ:

printf "foo\nbar\n"  # this does what you're trying to do in the example 
printf "%s\n" "$var"  # behaves like 'echo "$var"', except escapes will never be interpreted 
printf "%b\n" "$var"  # behaves like 'echo "$var"', except escapes will always be interpreted 
printf "%b\n" "foo\nbar" # also does your example 
+0

Tuyệt vời, cảm ơn các chi tiết. Tôi khá thích printf trong C vì vậy nó sẽ là một snap. –

1

Sử dụng

bí danh vang/usr/bin/echo

để buộc 'echo' gọi echo mà giải thích 'coreutils tham số -e'.

Các vấn đề liên quan