Tại sao không hỗ trợ tiếng vang hỗ trợ


36

Khi tôi cố gắng in ra một số văn bản màu bằng các chuỗi thoát ANSI thông qua echolệnh tích hợp, có vẻ như \echuỗi thoát trong chuỗi tôi cung cấp được hiểu theo nghĩa đen thay vì "thoát" mà nó được biểu thị. Điều này chỉ xảy ra trong Snow Leopard - các ví dụ dưới đây hoạt động như dự định trong Leopard.

Rõ ràng là echokhông hỗ trợ -echuyển đổi vì nó diễn giải chính xác \nkhi sử dụng nó:

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"


~ $ 

Nhưng khi tôi cố gắng sử dụng \e, tôi nhận được điều này:

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

Như tôi đã nói, trong Leopard, ở trên sẽ cho tôi chuỗi "MÀU SẮC" có màu.

Có ai biết lý do tại sao điều này có thể là một sự thay đổi dự định? Làm thế nào về một cách giải quyết để in các chuỗi thoát ANSI từ các tập lệnh Bash trên Snow Leopard?

Phiên bản vỏ Bash trên máy Leopard của tôi 3.2.17(1)-release3.2.48(1)-releasetrên máy Snow Leopard của tôi.


1
Câu hỏi mâu thuẫn với bài viết. Trong câu hỏi bạn đề cập đến / bin / echo, trong khi trong bài đăng bạn sử dụng echo không có đường dẫn, mà rất có thể là tiếng vang dựng sẵn của shell của bạn.
0x89

Tất nhiên - cảm ơn vì đã chú ý. Tôi đã sửa câu hỏi để phản ánh điều này.
hasseg

Câu trả lời:


24

Tôi không thể cho bạn biết lý do tại sao nó không hỗ trợ lập luận đó (bạn có thể phải hỏi các lập trình viên về điều đó). Tôi chỉ biết rằng trên hộp linux của tôi, tôi nhận được điều này:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  \0NNN   the character whose ASCII code is NNN (octal)
  \\     backslash
  \a     alert (BEL)
  \b     backspace
  \c     produce no further output
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab

NOTE: your shell may have its own version of echo, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report echo bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report echo translation bugs to <http://translationproject.org/team/>
  • điều này không đề cập đến việc \etrốn thoát
  • Nó nói rằng đó là /bin/echotừ coreutils gnu. Khi apple thay đổi nguồn của các thành phần hệ thống unix của chúng theo thời gian (ví dụ: chuyển từ zsh sang bash), hãy kiểm tra xem có sự thay đổi nào /bin/echogiữa Leopard và Snow Leopard không. Nếu đó là gnu, bạn có thể hỏi mọi người tại gnu.org tại sao họ chọn không bao gồm các chuỗi đó.

Đối với cách giải quyết (điều đó thú vị hơn): Không sử dụng /bin/echo, nhưng nội dung dựng sẵn của bash echohoạt động trên các hộp linux. Nếu chúng thay đổi thành bash mà không có tiếng vang dựng sẵn (hoặc một cái gì đó thậm chí còn khó hiểu hơn), bạn cũng có thể thử tính năng không được biết đến rộng rãi này của vỏ của bạn (hoạt động ít nhất là trong bash và zsh):

$ echo $'\e[34m''COLORS'

Đây là phần phù hợp của trang web của bash:

   Words  of  the  form  $'string' are treated specially.  The word expands to string, with
   backslash-escaped characters replaced as specified by the ANSI  C  standard.   Backslash
   escape sequences, if present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the  eight-bit  character whose value is the octal value nnn (one to three
                 digits)
          \xHH   the eight-bit character whose value is the hexadecimal value  HH  (one  or
                 two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the dollar sign had not been present.

   A  double-quoted string preceded by a dollar sign ($) will cause the string to be trans
   lated according to the current locale.  If the current locale is C or POSIX, the  dollar
   sign  is  ignored.  If the string is translated and replaced, the replacement is double-
   quoted.

4
Tôi đã không nhận thức $'string'được việc thoát khỏi trình tự - đã bật, cảm ơn.
hasseg

1
\ekhông phải là một phần của tiêu chuẩn POSIX; việc triển khai lõi GNU được mở rộng trên tiêu chuẩn. OS X thì không.
Martijn Pieters


15

Liệu \033vẫn làm việc? Nếu không, bạn có thể hy vọng nhấn Ctrl + V theo sau là phím Escape (nếu mac có các phím đó) để tạo một ký tự điều khiển thực bên trong dòng lệnh (tất nhiên là không hoạt động tốt trong các tập lệnh, tùy thuộc vào trình soạn thảo)


5
\033thay vì \elàm việc, cảm ơn.
hasseg

4
Chỉ để tham khảo, 33là giá trị bát phân của ký tự Escape .
TachyonVortex

Chỉ để tham khảo người đọc trong tương lai 033sẽ được chuẩn hóa cách viết bát phân.
ocodo

11

Một cách khác để in các chuỗi thoát ANSI trong trình bao là sử dụng /usr/bin/printf.


3
printf là cách di động để hiển thị mọi thứ trong vỏ. Có quá nhiều hương vị của tiếng vang ...
mouviciel

6

Để bổ sung cho câu trả lời hữu ích hiện có với một số thông tin cơ bản :

Nếu bạn đang cách gọi echobằng tên chỉ - như trái ngược với với đường đi của nó, /bin/echo- bạn đang gọi Bash dựng sẵn chứ không phải là các tiện ích bên ngoài.

Hành vi của các phần tử Bash gốc như nội dung thường di động theo nghĩa Bash, nghĩa là chúng phải hoạt động giống nhau trên bất kỳ nền tảng nào có khả năng chạy Bash .

\elà một ngoại lệ gây tò mò ảnh hưởng đến các phiên bản 3.x Bash trên macOS (cho đến ngày nay, kể từ v10.13.5 (High Sierra), macOS đi kèm với các phiên bản 3.x lỗi thời của Bash, vì lý do pháp lý).

\e(và bí danh của nó \E) nên làm việc với echo -e; \ehỗ trợ đã được thêm vào echonội dung trong Bash 2.0 . , nhưng không thể giải thích được trong phiên bản chứng khoán 3.x trên macOS.

\e không hoạt động trong các phiên bản 3.x Bash trên các nền tảng khác , chẳng hạn như MSYS trên Windows.

Ngược lại, nếu bạn cài đặt và sử dụng Bash 4.x trên macOS, \e sẽ hoạt động.


2

Họ có thể cố gắng tuân thủ POSIX: http://www.opengroup.org/onlinepub/9699919799/

Phần TÙY CHỌN nêu trong số những điều khác:

Implementations shall not support any options.

Đây là liên kết trực tiếp đến tài liệu tôi nghĩ bạn dự định: opengroup.org/onlinepub/9699919799/utilities/echo.html
Tạm dừng cho đến khi có thông báo mới.

Không. Trang tiếp tục viết: 'Nếu toán hạng đầu tiên là -n hoặc nếu bất kỳ toán hạng nào chứa ký tự <backslash>, kết quả được xác định theo thực hiện.' Ngoài ra, tiếng vang macOS không giải thích -e.
Yongwei Wu

2

FYI, chúng tôi sắp thêm \ e hỗ trợ vào / bin / echo và / usr / bin / printf trong coreutils. Lưu ý các tiêu chuẩn C không chỉ định \ e, nhưng gcc, perl, bash, ksh và tcsh hỗ trợ nó


0

Bạn có thể kiểm tra xem ,, thoát các ký tự không phải ascii 'đã được bỏ chọn trong menu tùy chọn xem của terminal.app.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.