ServerFaultでこの問題が検出されました。
^V
私はこの部分をずっと前から知っていました。その記事で私が興味を持っているのは、OPがタブ補完で文字を(キャレットの後に)として扱うことが^C
できることです。画面に表示されます。^C
C
ls
ls -b
\003
ls -N
^C
ls --show-control-chars
ls
最初の質問は、タップ補完と同じタイプの出力(^C
キャレットの後などC
)を生成する簡単な方法はありますか? (cat -v
行動)。
$LANG
$LC_*
2番目の質問は、環境変数がタブ補完で生成された出力にどのように影響するかです(complete
Bashマニュアルのセクション8に文書化されていますが、これについては何も見つかりません)。
私はbash
4.3を使用していますが、他のシェルの解決策も歓迎しています。
答え1
この動作は、すべてのシェルで同じではありません。
Bourne Againシェルは説明されているように機能し、その文字がシェルに入力される方法と一致しない表現でファイル名を表示します。 TENEX Cシェルも同じ機能を果たします。どちらの場合も、文字シーケンスは^C
文字ファイル名と一致しません。
AlmquistおよびKornシェルは、多くの端末で何もしない制御文字のみを作成し、完成リストを表示するときに列幅の計算に幅1を含めるため、これは間違っています。これにより列のソートが失敗します。
Zシェルは、コマンド入力の使用に関連するタスクを実行する唯一のシェルです。メニューベースのタブ補完機能は、ファイル名を$'\003'
。rm
rm
ZLEのタブ補完でコマンドに記入される内容、Zシェルを使用してファイルを削除します。
RM $'\003'
KornおよびAlmquistハウジングと互換性があります。
これは些細なことです。
この-w
オプションを使用すると、制御文字がそのまま出力されますが、多くの端末では何もしません。しかし、少なくともls
幅がゼロであり、列整列計算エラーを引き起こさないことに気付く健全な精神があります。
はい、これはFreeBSD / TrueOSですls
。
そして、どの構成もls
他のユーザーの動作と一致することはできません。
両方-B
とも-b
、特別なCエスケープシーケンスを持たない文字に対して装飾されていない8進数エスケープシーケンスを印刷します。しかし、シェルは提供されません飾らないリストから8進数エスケープシーケンスを完成させます。 Zシェルは最も近いですが、$'…'
完成時に8進エスケープシーケンスへの参照を使用します。
Bourne Again および TENEX C シェルがファイル名を表示する方法と一致するものはありません。
地域設定
ロケールは基本的にここでは関係ありません。この文字は印刷されない制御文字であり、ロケール設定とほとんど関係ありません。 C0シリーズ(EBCDICファン)は、ほとんど普遍的に制御文字と見なされます。