BSDのvis(1)ユーティリティに相当するLinux


3

zshCLIベースのタスク用のスクリプトがたくさんあり、それらのほとんどをFreeBSDおよびMacOS(BSD Unixフレーバーの両方)で開発しました

私は最近Ubuntuを使用していますが、私のスクリプトのいくつかが壊れていることに気付きました。まだ修正していない数少ないスクリプトの1つは、vis(1)印刷できない文字を「目に見える」同等物に変換する一般的なユーティリティに依存しています。たとえば、BELLキャラクターはniceに^Gなり、見苦しいエスケープ」は、それらをpingしてパイピングした\e後になります。echovis

画面をデバッグしたり、画面を混乱させたり、画面をロックしたりする場合に非常に便利です。

通常、FreeBSDの場合のようにベースシステムと共にインストールされていないvis(1)場合、MacOSの場合のように、Homeinfoでも利用可能なterminfoパッケージにバンドルされています。

しかし、Linuxでも、ディストリビューションのterminfoパッケージでも見つかりません。実際には、 vis(1)ように見えるある種のviクローン Ubuntuの上!

最も近いものはlibbsd-devパッケージにありましたが、このパッケージvis.hにはシステムコールstrvis(3)とのライブラリ、マニュアルページ、Cヘッダーの定義のみが含まれていますstrunvis(3)

Linuxで同様の機能を備えたユーティリティはありますか?取得するにはどのパッケージをインストールする必要がありますか?Ubuntuが望ましいですか?


vis2016年のエディターのバグレポート:github.com/martanne/vis/issues/338
Nathaniel M. Beaver

回答:


3

GNU coreutilsにcatは、その機能が(無意識に)組み込まれています。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'

hmmm .. catまたはsedがそれを行うことができることを知りませんでした。情報ページを読む(何が間違っていたのmanか?)とにかく良いキャッチ!ただし、ディープトラフマニュアルをダイビングすると、システム固有のユーティリティに依存せず、zshシェル自体の標準機能に依存するため、ポータブルソリューションが見つかりました。したがって、ターゲットシステムでzshが使用可能であれば、移植性の問題はもうありません!
-hlecuanda

2

結局のところ、パッケージャーとメンテナーの気まぐれにある外部ユーティリティに依存しないという追加の特典がある、100%ポータブルなソリューションがあります!

巨大なzshマニュアルページの表面をスクラッチした後、私はあいまいで、おそらくほとんど知られていない機能を見つけました。

だから我々は持っているブレース展開(またはパラメータの変数のzsh-speak)ちょうどので、変数のブレース展開を行う際に使用できるフラグの全体の束があることを起こる、と著しく便利な物事は、このようなフラグで行うことができます。私は変数に見苦しいapnd潜在的に端末ロックtermcapsを保存するのであれば、私がしなければならないすべてが使用され(V)たときにフラグをechoINGのprintINGのか、いくつかの点で新しい変数に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)and (z)フラグを見つけました(Q)。これは、スラッシュ、オクタル、一重引用符、二重引用符を含むすべての文字列でシェル引用符()を修正します。魔法のようにそれらをシェルセーフにしますが(z)、私が正しく理解すれば、ネストされた引用文字列に対してシェルセーフな方法で1レベルの引用を「剥離」します。私はこれらの2年前に知っていたのに!:C


ええと、Linuxディストリビューションではzsh自体は「外部ユーティリティ」ではありませんか?
-grawity

1
すべてのシステムでデフォルトのシェルとして使用します。設定されると、外部ユーティリティではなく、システムシェルになります。そのため、たとえば、スクリプトをOSに移植できると確信しています。なぜならvis(1)、スクリプトをBeOS twomorrow、およびBeOS zsh用のポートがあります(実際にはAndroid用のポートがあるので)、それらを調整する必要はありません。実際のところ、zsh はこのような目的のためにzftp、かなり大きなものを実装していることを読んでいztcpます。
hlecuanda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.