印刷できない文字が必要なプログラムがあります。0x0F(ctrl+ 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進文字エスケープをサポートします。
- 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つのオプションのもう1zsh
つksh
は、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