Có bất kỳ lợi ích khách quan để thoát khỏi trình tự vượt qua?


11

Trong .*rccác tệp của mọi người tôi thấy trực tuyến hoặc bằng nhiều mã khác nhau, tôi có xu hướng thấy nhiều người sử dụng các chuỗi thoát ANSI theo cách thủ công thay vì sử dụng tput.

Tôi đã hiểu rằng đó tputlà phổ quát / an toàn hơn, vì vậy điều này khiến tôi tự hỏi:

Có bất kỳ lý do khách quan nào người ta nên sử dụng trình tự thoát thay cho tput? (Tính di động, mạnh mẽ về lỗi, thiết bị đầu cuối bất thường ...?)


Mặt trái của câu hỏi về tính di động, MobaXterm sẽ hoạt động printfvà các chuỗi thoát ANSI, nhưng tputkhông thành công (ít nhất là trên hộp của tôi).
tự đại diện

Câu trả lời:


6

tputcó thể xử lý các biểu thức (ví dụ trong sgrsetaf) mà trình biên dịch shell điển hình sẽ tìm thấy ít hơn mức có thể sử dụng. Để có ý tưởng về những gì liên quan, hãy xem kết quả đầu ra infocmpvới -ftùy chọn (định dạng) được áp dụng. Đây là một trong những ví dụ sử dụng các chuỗi từ mô tả terminfo của xterm :

xterm-16color|xterm with 16 colors,
        colors#16,
        pairs#256,
        setab=\E[
                %?
                        %p1%{8}%<
                        %t%p1%{40}%+
                %e
                        %p1%{92}%+
                %;%dm,
        setaf=\E[
                %?
                        %p1%{8}%<
                        %t%p1%{30}%+
                %e
                        %p1%{82}%+
                %;%dm,
        setb=
                %p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa
                %?%ga%{1}%=
                        %t4
                %e%ga%{3}%=
                        %t6
                %e%ga%{4}%=
                        %t1
                %e%ga%{6}%=
                        %t3
                %e%ga%d
                %;
                m,
        setf=
                %p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa
                %?%ga%{1}%=
                        %t4
                %e%ga%{3}%=
                        %t6
                %e%ga%{4}%=
                        %t1
                %e%ga%{6}%=
                        %t3
                %e%ga%d
                %;
                m,
        use=xterm+256color,
        use=xterm-new,

Định dạng chia nhỏ mọi thứ - một kịch bản hoặc chương trình để làm tương tự sẽ phải tuân theo các vòng xoắn và lượt đó. Hầu hết mọi người bỏ cuộc và chỉ sử dụng các chuỗi dễ nhất.

Tính năng 16 màu được mượn từ IBM aixterm, ánh xạ 16 mã mỗi mã cho tiền cảnh và nền trên hai phạm vi;

  • tiền cảnh vào 30-37 và 90-97
  • nền 40-47 và 100-107

Một kịch bản đơn giản

#!/bin/sh
TERM=xterm-16color
export TERM
printf '    %12s %12s\n' Foreground Background
for n in $(seq 0 15)
do
    F=$(tput setaf $n | cat -v)
    B=$(tput setab $n | cat -v)
    printf '%2d  %12s %12s\n' $n "$F" "$B"
done

và đầu ra cho thấy cách nó hoạt động:

      Foreground   Background
 0        ^[[30m       ^[[40m
 1        ^[[31m       ^[[41m
 2        ^[[32m       ^[[42m
 3        ^[[33m       ^[[43m
 4        ^[[34m       ^[[44m
 5        ^[[35m       ^[[45m
 6        ^[[36m       ^[[46m
 7        ^[[37m       ^[[47m
 8        ^[[90m      ^[[100m
 9        ^[[91m      ^[[101m
10        ^[[92m      ^[[102m
11        ^[[93m      ^[[103m
12        ^[[94m      ^[[104m
13        ^[[95m      ^[[105m
14        ^[[96m      ^[[106m
15        ^[[97m      ^[[107m

Các số được chia ra vì aixterm sử dụng các phạm vi 30-37 và 40-47 để khớp với các màu ECMA-48 (còn được gọi là "ANSI") và sử dụng phạm vi 90-107 cho các mã không được xác định trong tiêu chuẩn.

Dưới đây là một ảnh chụp màn hình với xterm sử dụng TERM=xterm-16color, nơi bạn có thể thấy hiệu ứng.

nhập mô tả hình ảnh ở đây

Đọc thêm:


Tôi có thể đang chứng minh quan điểm của bạn, nhưng thỏa thuận với những biểu hiện này là gì? Từ khi xem hướng dẫn sử dụng cho infocmp, tôi nhận ra chúng là những câu lệnh if-then-other ... nhưng tôi chưa bao giờ thấy điều này và tôi gặp khó khăn trong việc tìm kiếm nó, đây là tất cả những gì tôi tìm thấy, nhưng tôi không chắc nó có chuyện gì đang xảy ra ở đây. Cảm ơn!
Thuyền trưởng Man

2

Xuất phát từ thời điểm các nền tảng UNIX có thể có nhiều loại thiết bị được gắn vào chúng, tôi vẫn thích sử dụng các mục tiêu hơn và các bạn bè của nó hơn các chuỗi thoát theo nghĩa đen.

Tôi nghĩ lý do thực sự là hầu hết mọi người chỉ đơn giản là không biết về tputvà các tệp terminfo/ termcapthư viện và liên kết của nó .


1

Một trong những lý do là tputlệnh bên ngoài, do đó có thể chạy chậm hơn mã thoát vỏ tích hợp. Một điều nữa là người ta có thể dễ dàng tạo một lớp lót kết hợp mã thoát ANSI với các ký tự thoát cụ thể của vỏ, chẳng hạn như trong bashdấu nhắc:

PS1='\[\033[1;32m\]\u@\h\[\033[1;34m\] \w >\[\033[0m\] '

tương tự trong zsh:

PS1=$'%{\e[1;32m%}%n@%m%{\e[1;34m%} %3~> %{\e[0m%}'

Ở đây mọi thứ đều rõ ràng và nhỏ gọn. Với tputmột người sẽ cần phải chia nó thành nhiều dòng hoặc làm cho nó dài hơn và phức tạp hơn, thực thi tputnhiều lần, v.v.


1
Với thông số bạn vẫn có thể thực hiện oneliners, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Captain Man

2
Trên thực tế, đó sẽ là $(tput sgr0)kết thúc, nhưng đồng ý rằng việc kể chuyện là một sự cải tiến.
Thomas Dickey
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.