2

У меня есть несколько zsh скриптов для задач, основанных на cli, и я разработал большинство из них для FreeBSD и MacOS (оба варианта BSD Unix)

В последнее время я пользуюсь Ubuntu и заметил, что некоторые из моих скриптов были сломаны. Один из немногих сценариев, которые мне еще предстоит исправить, зависит от vis(1), общей утилиты для перевода непечатных символов в их "видимый" эквивалент. v.gr Персонажи BELL становятся хорошими ^G , неприглядные " побеги " становятся \e 'S после того, как они echo и пропускают их через vis .

Это очень удобно при отладке вывода экрана, который в противном случае мог бы испортить или даже заблокировать экран.

Обычно, когда не устанавливается с базовой системой, как в случае с FreeBSD, vis(1) поставляется в пакетах terminfo, как в случае с MacOS, где он доступен даже на homebrew.

однако я не могу найти его в Linux или в пакетах terminfo для моего дистрибутива. Фактически, vis(1) похоже, является своего рода клоном vi в Ubuntu !.

Самое близкое, что я мог найти, было в пакете libbsd-dev , однако этот пакет включает только определения библиотеки, man-страницы и C-заголовка vis.h для системных вызовов strvis(3) и strunvis(3) .

Есть ли в linux утилита с похожим функционалом? какой пакет я должен установить, чтобы получить его; желательно для Ubuntu?

2 ответа2

2

cat GNU Coreutils' имеет эту функцию (позорно) , построенную в - если вы не против нарушения UTF-8:

cat -v

В sed есть аналогичная функция, хотя она также сгибает строки до 80 байт:

sed -n l

Что-то более портативное будет:

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

Я думаю, что это будет лучше обрабатывать Unicode:

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

Как выясняется, существует 100% портативное решение, с дополнительным преимуществом, не зависящим от какой-либо внешней утилиты по прихоти упаковщиков и сопровождающих!

Поцарапав поверхность гигантских страниц man zsh , я обнаружил неясную и, вероятно, малоизвестную особенность.

Таким образом, у нас есть скобочное расширение для переменных (или параметров в zsh -speak), так получилось, что есть целая куча флагов, которые вы можете использовать при выполнении скобочного раскрытия переменной, и с такими флагами можно сделать очень удобные вещи. Так что, если я хранить неприглядный apnd потенциально терминальные блокировки termcaps в переменной, все , что я должен сделать , это использовать (V) флаг , когда echo ИНГ print или Ing в какой - то момент во время assgning новой переменной. и он будет иметь тот же эффект, что и упомянутая выше утилита vis(1) . Внутренне это на самом деле strvis(3) переопределено. поэтому мое решение было так:

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)

в качестве бонуса я нашел флаги (Q) и (z) , которые будут корректно цитировать оболочки ((Q)) для любой строки, содержащей косые черты, восьмеричные, одинарные и двойные кавычки. Магически делает их безопасными для оболочки, в то время как (z) если я правильно понимаю, будет « очищать » один уровень цитирования безопасным для оболочки способом для любой строки с вложенными кавычками. Жаль, что я не знал об этом два года назад! :C

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .