In một cái gì đó trong bảng điều khiển ở cùng một vị trí của tiếng vang trước đó, với một loại tiếng vang tiêu cực


9

Trong bash, bạn có thể truyền lệnh có tên clearđể xóa tất cả các lệnh trên màn hình.

Và với echobạn có thể in bất cứ điều gì bạn muốn trên màn hình ..

Trong các tập lệnh đơn giản của tôi, tôi thường có nhu cầu in một tỷ lệ phần trăm những gì đang được thực hiện với các lệnh của tôi ..

Vì vậy, tôi có thể làm một cái gì đó như ..

echo "89%"
echo "90%"
echo "91%"

và như thế..

điều tôi ghét là màn hình có đầy đủ các phần trăm cập nhật ...

89%
90%
91%
...

những gì tôi muốn là tìm hiểu nếu có một tổ hợp ký tự đặc biệt (ví dụ: "\ 033 [01; 31m") có thể được lặp lại bằng bash hoặc php echo và nói với bảng điều khiển "xóa ký tự được in trước đó .."

làm như vậy bằng cách sử dụng một cái gì đó như: (ví dụ php)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

Tôi sẽ nhận được chuỗi mới được in ở vị trí chính xác của chuỗi trước mà không có màn hình đầy dòng

Mặt khác, tôi tìm cách tiếp cận để làm tương tự theo các cách khác luôn sử dụng tập lệnh bash và php (vui lòng bao gồm các ví dụ hoạt động thực tế ít nhất là với bảng điều khiển debian9 và php7)

Câu trả lời:


24

Cách điển hình để làm điều này không phải là xóa một ký tự đơn lẻ, mà là quay trở lại điểm bắt đầu của dòng bằng cách sử dụng quay trở lại ( \r):

printf "89%%"; sleep 1; printf "\r90%%\n"

Lưu ý rằng điều này không xóa dòng, vì vậy bạn cần phải chăm sóc nó nếu cần thiết. Các tùy chọn đơn giản là thêm khoảng trắng vào cuối hoặc làm cho chiều rộng đầu ra cố định (ví dụ: printf "%2d%%\n" 1cung cấp một không gian hàng đầu).

Có các lối thoát thiết bị đầu cuối sẽ cho phép bạn di chuyển xung quanh và xóa các phần của màn hình, các chuỗi CSI , nhưng chúng phụ thuộc vào thiết bị đầu cuối (mặc dù trong thực tế, thoát VT100 được hỗ trợ ở mọi nơi bây giờ). Ví dụ

printf "89%%"; sleep 1; printf "\e[3D90%%\n"

sử dụng ␛[3Dđể di chuyển ba ký tự sang trái và viết lên chúng (giả sử printfhỗ trợ của bạn \e);

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"

sử dụng ␛[0Eđể di chuyển đến đầu dòng hiện tại và ␛[Kxóa đến cuối dòng (giả sử thiết bị đầu cuối của bạn hỗ trợ các chuỗi đó).

tputcung cấp một printfcách thức cuối cùng và không thể truy cập vào các chuỗi này:

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"

sẽ di chuyển con trỏ sang trái ba lần ( cub 3) và xóa đến cuối dòng ( el), sử dụng bất kỳ chuỗi ký tự nào phù hợp với thiết bị đầu cuối hiện tại;

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"

sẽ di chuyển con trỏ đến cột ngoài cùng bên trái ( hpa 0) và xóa đến cuối dòng.

man terminfosẽ cho bạn biết những gì mà khả năng của tên sử dụng mà sử dụng với tput.

(Lưu ý rằng rất nhiều chi tiết cụ thể của các ví dụ ở trên cho rằng tất cả đầu ra của bạn nằm trên cùng một dòng. Chúng không được coi là bằng chứng ngu ngốc, chỉ để minh họa các cách tiếp cận khác nhau.)

Đối với điều khiển màn hình tương tự trong các tập lệnh PHP, bạn có thể xem ncursesphần mở rộng PECL .


5
Người ta thường có thể sử dụng tput cub 3để di chuyển cu rsor b ack bằng 3 cột mà không cần phải mã hóa chuỗi (và tput elđể e rase the l ine).
Stéphane Chazelas

1. \ekhông di động 2. cũng không phải\e[0E
Steven Penny

Cảm ơn @Steven, tôi đã đề cập rằng các chuỗi phụ thuộc vào thiết bị đầu cuối nhưng tôi đã thêm một số vòng loại.
Stephen Kitt

Người ta có thể sử dụng echđể tẩy xóa. Và di chuyển ngược về 3 vị trí có một hình ảnh xác thực và hai tối ưu hóa có thể có mà các chương trình toàn màn hình có xu hướng sử dụng. Nhưng cả tối ưu hóa và xóa đều quá mức cần thiết cho các công cụ đầu cuối chỉ có dòng đơn giản, khi người ta làm theo lời khuyên đó để sử dụng một công cụ xác định định dạng chiều rộng cố định. Nhân tiện, đừng quên đó 100là 3 chữ số. (-:
JdeBP

Điểm tốt @JdeBP, cảm ơn. Khi bạn đạt 100%, tôi chắc chắn hy vọng bạn không còn cần cập nhật tiến độ ;-).
Stephen Kitt
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.