ddコピーにキーボード入力

7-2. バイナリ処理

ddコマンド、まだまだ続きます。

今回はキーボードからの入力をddコマンドに与えて、ファイルを作ってみます。

試しにddコマンドに何もオプションを指定せずに実行。

takk@deb9:~/tmp$ dd > test.bin
hello

コマンドが戻ってきません。ずっと入力待ちになっているようです。

次は、文字を入力後、Ctrl+Cを押して止めてみます。

takk@deb9:~/tmp$ dd > test.bin
hello
^C0+1 レコード入力
0+0 レコード出力
0 bytes copied, 33.3524 s, 0.0 kB/s

takk@deb9:~/tmp$ 

0 Byteをコピー、つまり中身が空のファイルが生成されました。
一応内容とサイズを確認してみます。

takk@deb9:~/tmp$ hd test.bin
takk@deb9:~/tmp$ wc -c test.bin
0 test.bin
takk@deb9:~/tmp$ 

ddコマンドでbs等のオプションを指定しないとデフォルトの512 Byteが蓄積されるまでコピーしないので、このように空ファイルになります。

次は、オプションで3Byteを指定してみます。入力する文字列として”abc”。

takk@deb9:~/tmp$ dd bs=1 count=3 > test.bin
abc
3+0 レコード入力
3+0 レコード出力
3 bytes copied, 6.47145 s, 0.0 kB/s
takk@deb9:~/tmp$ 

abcを入力後に、Enterを押せばコピーされます。

中身を見てみます。

takk@deb9:~/tmp$ hd test.bin
00000000  61 62 63                                          |abc|
00000003
takk@deb9:~/tmp$ 

abcの文字コードになってますね。

さて、指定したサイズよりも長い文字列を入力して、Enterを押すとどうなるでしょうか。

takk@deb9:~/tmp$ dd bs=1 count=3 > test.bin
123456
3+0 レコード入力
3+0 レコード出力
3 bytes copied, 2.88702 s, 0.0 kB/s
takk@deb9:~/tmp$ 456
bash: 456: コマンドが見つかりません
takk@deb9:~/tmp$ 

“123”までがファイルに格納されて、”456″はddコマンド終了後に、別コマンドとみなされて、実行されてしまいました。

“123”は正しく格納されています。

takk@deb9:~/tmp$ hd test.bin
00000000  31 32 33                                          |123|
00000003
takk@deb9:~/tmp$ 

キー入力ですが、文字しか入力できないわけではないです。
数値を入力してみます。

数値を入力するには、CTRL+Vの入力後に続けて該当するキーを押せばよいです。
次の例では、CTRL+V、Aを入力し、数値の1を指定しています。

takk@deb9:~/tmp$ dd bs=1 count=1 > test.bin
^A
1+0 レコード入力
1+0 レコード出力
1 byte copied, 6.14248 s, 0.0 kB/s
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ hd test.bin
00000000  01                                                |.|
00000001
takk@deb9:~/tmp$ 

数値は、それぞれ以下のアルファベットが割り当てられています。

takk@deb9:~/tmp$ echo {A..Z} | tr ' ' "\n" | cat -n | pr -t5l1 | expand -t1
     1 A         2 B       3 C        4 D      5 E
     6 F         7 G       8 H        9 I     10 J
    11 K        12 L      13 M       14 N     15 O
    16 P        17 Q      18 R       19 S     20 T
    21 U        22 V      23 W       24 X     25 Y
    26 Z
takk@deb9:~/tmp$ 

上の表から、数値26をファイルに保存したいなら、CTRL+V、Zとなります。

takk@deb9:~/tmp$ dd bs=1 count=1 > test.bin
^Z
1+0 レコード入力
1+0 レコード出力
1 byte copied, 7.67125 s, 0.0 kB/s
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ hd test.bin
00000000  1a                                                |.|
00000001
takk@deb9:~/tmp$ 

0x1a=26です。

0と27以降の入力方法はこの通り。
CTRL+[ 27
CTRL+\ 28
CTRL+] 29
CTRL+^ 30
CTRL+_ 31
CTRL+@ 0

32(0x20)からは、以下の通り。まあ、ASCIIコードですね。

takk@deb9:~/tmp$ seq 32 127 | perl -ne 'print chr' | od -tx1 -c -Ax
000000  20  21  22  23  24  25  26  27  28  29  2a  2b  2c  2d  2e  2f
             !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /
000010  30  31  32  33  34  35  36  37  38  39  3a  3b  3c  3d  3e  3f
         0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
000020  40  41  42  43  44  45  46  47  48  49  4a  4b  4c  4d  4e  4f
         @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
000030  50  51  52  53  54  55  56  57  58  59  5a  5b  5c  5d  5e  5f
         P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _
000040  60  61  62  63  64  65  66  67  68  69  6a  6b  6c  6d  6e  6f
         `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
000050  70  71  72  73  74  75  76  77  78  79  7a  7b  7c  7d  7e  7f
         p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ 177
000060
takk@deb9:~/tmp$ 

バイナリエディタがないときに、ファイルの一か所だけ修正、とかに使えるでしょうか。

コメント

タイトルとURLをコピーしました