Linux tương đương với tiện ích vis (1) của BSD


2

Tôi có một loạt zsh tập lệnh cho các tác vụ dựa trên cli và đã phát triển hầu hết chúng trên FreeBSD và MacOS (Cả hai hương vị BSD Unix)

Gần đây tôi đã sử dụng Ubuntu và nhận thấy một số tập lệnh của tôi bị hỏng. Một trong số ít các kịch bản tôi chưa sửa, phụ thuộc vào vis(1), một tiện ích phổ biến để dịch các ký tự không thể in thành tương đương "hiển thị" của chúng. v.gr BELL nhân vật trở nên tốt đẹp ^G s, khó coi " trốn thoát " trở nên \e sau echo ing và đường ống dẫn chúng qua vis.

Nó rất tiện lợi khi gỡ lỗi đầu ra màn hình có thể gây rối hoặc thậm chí khóa màn hình.

Thông thường, khi không được cài đặt với hệ thống cơ sở như trường hợp trên FreeBSD, vis(1) đi kèm trong các gói terminfo, như trường hợp trên MacOS, nơi nó có sẵn ngay cả trên homebrew.

tuy nhiên tôi không thể tìm thấy nó trên Linux hoặc trong các gói terminfo để phân phối. Trong thực tế, vis(1) dường như là một số loại vi nhân bản trên Ubuntu!.

Thứ gần nhất tôi có thể tìm thấy là trên libbsd-dev gói, tuy nhiên gói này chỉ bao gồm thư viện, trang man và định nghĩa tiêu đề C vis.h cho các cuộc gọi hệ thống strvis(3)strunvis(3).

Có một tiện ích với chức năng tương tự có sẵn trên linux? Tôi nên cài đặt gói nào để có được nó; tốt nhất cho Ubuntu?

Câu trả lời:


2

GNU coreutils ' cat có chức năng đó (nổi tiếng) được tích hợp - nếu bạn không phiền nó phá vỡ UTF-8:

cat -v

Có một chức năng tương tự trong sed, mặc dù nó cũng gấp các dòng thành 80 byte:

sed -n l

Một cái gì đó di động hơn sẽ là:

perl -p -e 's/[^\t\n\x20-\xFF]/sprintf("\\x%02X", ord($&))/ge'

Tôi nghĩ rằng điều này sẽ xử lý Unicode tốt hơn:

perl -C -p -e 's/[^\n\P{Other}]/sprintf("\\x{%04X}", ord($&))/ge'

hmmm .. không biết con mèo HOẶC sed có thể làm điều đó .... đọc thông tin trang (có gì sai với man?)) Dù sao nó là một bắt tốt! Tuy nhiên, hướng dẫn sử dụng máng sâu tôi đã tìm thấy một giải pháp di động vì nó sẽ không phụ thuộc vào các tiện ích dành riêng cho hệ thống, mà phụ thuộc vào tính năng tiêu chuẩn của vỏ zsh! vì vậy không có vấn đề về tính di động nữa miễn là zsh có sẵn trên hệ thống đích!
hlecuanda

1

Hóa ra, có một giải pháp di động 100%, với các lợi ích bổ sung không phụ thuộc vào bất kỳ tiện ích bên ngoài nào theo ý thích của người đóng gói và bảo trì!

Sau khi gãi bề mặt của gargantuan zsh trang man, tôi tìm thấy một tính năng tối nghĩa và có lẽ ít được biết đến.

Vì vậy chúng tôi có mở rộng cú đúp cho các biến (hoặc tham số trong zsh -speak) điều đó xảy ra đến mức có cả đống cờ bạn có thể sử dụng khi thực hiện mở rộng cú đúp của một biến, và những điều tiện dụng đáng chú ý có thể được thực hiện với những cờ như vậy. Vì vậy, nếu tôi lưu trữ apnd khó coi có khả năng khóa đầu cuối trong một biến, tất cả những gì tôi phải làm là sử dụng (V) cờ khi echo ing print ing hoặc tại một số điểm trong khi gán cho một biến mới. và nó sẽ có tác dụng chính xác như đã nói ở trên vis(1) tiện ích. Bên trong nó thực sự strvis(3) thực hiện lại. Vì vậy, giải pháp của tôi là:

zmodload zsh/terminfo

typeset terminal_reset_sequence=$terminfo['rs2'] #toxic! locks terminal if echoed!
echo ${(V)terminal_reset_sequence} # Perfectly safe like piping trough vis(1)

như một phần thưởng, tôi tìm thấy (Q)(z) cờ, đó sẽ làm trích dẫn vỏ chính xác ( (Q) ) trên bất kỳ chuỗi nào chứa dấu gạch chéo, quãng tám, dấu ngoặc đơn và dấu ngoặc kép. Kỳ diệu làm cho chúng an toàn vỏ, trong khi (z) nếu tôi hiểu đúng, sẽ " bóc đi "một cấp độ trích dẫn theo cách an toàn vỏ trên bất kỳ chuỗi trích dẫn lồng nhau nào. Ước gì tôi biết về hai năm trước đây!


Huh, trong đó bản phân phối Linux zsh chính nó không phải là "tiện ích bên ngoài"?
grawity

1
Tôi sử dụng nó như vỏ mặc định của tôi trên mọi hệ thống. Một khi nó được thiết lập, nó không phải là tiện ích bên ngoài, nó là hệ thống vỏ. vì vậy, ví dụ, tôi chắc chắn rằng tất cả các tập lệnh của tôi sẽ có thể di động trên các HĐH, vì tôi đang sử dụng một tính năng tích hợp của trình bao, không phải là một tiện ích bên ngoài phụ thuộc hệ thống, như trường hợp vis(1) Nếu tôi cần chuyển kịch bản của mình sang BeOS vào thứ hai, và có một zsh cổng cho BeOS, (trên thực tế có một cho Android), sẽ không cần phải chỉnh bất kỳ cái nào trong số chúng. như một vấn đề thực tế, tôi chỉ đọc rằng zsh thực hiện một số thứ khá lớn như zftpztcp cho mục đích này chính xác.
hlecuanda
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.