Các shell khác ngoài Bash và Zsh có hỗ trợ trích dẫn ANSI-C không? ví dụ: $ 'chuỗi'


13

Tôi có một tập lệnh shell sử dụng đoạn mã sau để in dấu kiểm màu xanh lục trong đầu ra của nó:

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

Sau khi đọc về Trích dẫn ANSI-C của Bash , tôi nhận ra rằng tôi có thể sử dụng nó khi đặt các biến màu của mình và xóa -ecờ khỏi tiếng vang của tôi .

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

Điều này có vẻ hấp dẫn, vì nó có nghĩa là thông điệp được in chính xác cho dù nó được chuyển sang tiếng vang dựng sẵn của Bash hay sử dụng bên ngoài /bin/echo(Tôi đang sử dụng macOS).

Nhưng điều này có làm cho kịch bản ít di động? Tôi biết Bash và Zsh ủng hộ phong cách trích dẫn này, nhưng tôi không chắc về những người khác.


Có, vì khi chỉ có ksh và các biến thể của nó hỗ trợ cho đến bây giờ. Nhưng IIRC, trích dẫn ANSI-C sẽ có trong thông số POSIX tiếp theo.
cuonglm

Câu trả lời:


12

$'…'là một tính năng ksh93 cũng có trong zsh, bash, mksh, FreeBSD sh và trong một số bản dựng của BusyBox sh (BusyBox ash được xây dựng cùng ENABLE_ASH_BASH_COMPAT). Nó chưa có trong ngôn ngữ POSIX sh. Các shell giống như Bourne thông thường không có nó bao gồm dash ( /bin/shtheo mặc định trên Ubuntu), ksh88, shell Bourne, NetBSD sh, yash, các dẫn xuất của pdksh ngoài mksh và một số bản dựng của BusyBox.

Một cách di động để có được dấu gạch chéo ngược và dấu gạch chéo ngược được phân tích cú pháp dưới dạng ký tự điều khiển là sử dụng printf. Nó có mặt trên tất cả các hệ thống tuân thủ POSIX.

esc=$(printf '\033') # assuming an ASCII (as opposed to EBCDIC) system
col_green="${esc}[32;01m"

Lưu ý rằng \ekhông phải là di động. Nó được hỗ trợ bởi nhiều triển khai printfnhưng không phải bởi một trong dash¹. Sử dụng mã bát phân thay thế.

¹ Nó được hỗ trợ trong Debian và các dẫn xuất rằng tàu ít nhất 0.5.8-2.4, ví dụ như từ căng Debian và Ubuntu 17.04.


bạn có chắc chắn về việc \ekhông được hỗ trợ dash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'sẽ in printf is a shell builtinmàu đỏ đậm ở đây (dash-0.5.8). Một cái vỏ không hỗ trợ \eyash.
mosvy

@mosvy In \e[1;31mprintf is a shell builtin \e[mtại đây. Ubuntu 16.04, dấu gạch ngang 0,5.8-2.1ubfox2. In màu đỏ trên Ubuntu 18.04 với dấu gạch ngang 0,5,8-2.10. Có vẻ như Ubuntu đã tạo ra một bản vá để hỗ trợ nó.
Gilles 'SO- ngừng trở nên xấu xa'

Vâng, xin lỗi, có vẻ như đó là một bản vá debian (9.7 căng). đây là bản gốc
mosvy

0

Mức độ $'...'hỗ trợ cũng cần được xem xét khi chuyển. Các đề nghị Folks POSIX để đặt điều này trong POSIX sh đề cập đến một đặc biệt:

stephane: ksh93 là vỏ $ '...' đến từ (trong khi $'\uxxxx'[ $'\Uxxxxxxxx' ] đến từ zsh: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

Từ những gì tôi nhận được ở đây trên nền tảng Debian của tôi, ksh2020từ AT & T hiểu được $'\U1F600'. Đây là lớp vỏ Korn "chính thức" duy nhất tôi có thể có trên bản phân phối mới này.

mkshđã phân tích cú pháp nhưng đã khắc phục nó hoàn toàn bằng U + FFFE. Vì nó không phàn nàn về lỗi cú pháp nên có gì đó không đúng với cách hiểu về Unicode. Nó xử lý $'\U01F60'tốt.


Thật không may, như một hiệu ứng của một cuộc đảo chính gần đây ksh2020 đã bị biến mất. Nhưng vâng, ksh93 ban đầu không hỗ trợ $'...'và iirc nó là người đầu tiên đã làm.
mosvy

@ Arthur2e5. ksh2020không phải từ AT & T. Một vài người, một người từ Red Hat, về cơ bản đã cướp cây github AT & T AST vài năm trước và tuyên bố kiểm soát ksh93sự phát triển trong tương lai
fpmurphy
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.