コマンドラインに印刷できない文字を入力してください。

コマンドラインに印刷できない文字を入力してください。

印刷できない文字が必要なプログラムがあります。0x0Fctrl+ o)はプログラムの意図した部分を実行するための入力です。

0       000     00              NUL     �          Null char 
1       001     01              SOH               Start of Heading
2       002     02              STX               Start of Text
3       003     03              ETX               End of Text
4       004     04              EOT               End of 

コマンドラインから実行されます。印刷できない文字をプログラム入力としてコマンドラインに挿入する方法を知っていますか?

答え1

このprintfユーティリティは8進文字エスケープをサポートします。

  1. XBDファイル形式表記法(、、、、、、、、)'\\'に表示される'\a'エスケープシーケンスに加えて'\b''\f''\n''\r''\t''\v'"\ddd"ディディ8進数で指定された値でバイトを書き込む必要がある1桁、2桁、または3桁の8進数。

printf少なくともBashとZshの組み込み機能は、16進エスケープシーケンス\xHH$'...'同様の方法でエスケープシーケンスを挿入する引用符もサポートします。

したがって、特定のコマンドのコマンドライン引数にこれらの文字を使用するには、次の手順を実行します。

$ somecmd "arg_with_$(printf '\017')_xoff"

または、その文字を複数回使用する必要がある場合は、変数に入れてください。

$ xoff=$(printf '\017')
$ somecmd "many${xoff}odd${xoff}chars"

または、コメントに記載されているコマンドに2バイト0x0f 0x11(8進数)を送信します。017 021

$ printf "\x0f\x11" | somecmd...
$ printf "\017\021" | somecmd...

答え2

$\NNNこれはZSHが提供する形式によって異なります。

% perl -e 'printf "%vx\n", shift' $'\177'
7f
% 

2つのオプションのもう1zshkshは、aを使用してcontrol+vコマンドラインに挿入するreturnことです。しかし、これは退屈になり、シェル履歴を過度に複雑にする可能性があります。^M

これが欠落している場合のもう1つのオプションは、適切な文字をエクスポートするプログラムを実行することです。

% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
% 

または、プログラムに適したパラメータを持つ小さなCプログラムを使用すると、シェルが追加できる合併症を回避できます。

#include <err.h>
#include <unistd.h>

int main(void)
{
    execlp("perl", "perl", "-e", "printf \"%vx\\n\", shift", "\x0F",
           (char *) 0);
    err(1, "exec failed");
    return 1;
}

答え3

このコマンドが操作を実行しました。

printf '\x0f\x11' | program

関連情報