tl; dr - siehe "Schluss" ganz am Ende.
Was hier passiert, ist sehr interessant.
Vor allem echo -e
wirkt es so (von man 1 echo
):
\0NNN
Byte mit OktalwertNNN
(1 bis 3 Ziffern)
Dies bedeutet, dass 0
in \037
keine Oktalstelle steht, sondern lediglich ein Teil des \0
Präfixes ist, der die fortlaufende Oktaleingabe anzeigt. Sie \037
können sein \0037
und jetzt ist nur die Sekunde 0
eine Oktalziffer.
Noch innerhalb echo -e
\061
ist äquivalent zu \0061
. Dies entspricht 1
einem wörtlichen Zeichen, das "Eins" bedeutet.
Nun scheint es, dass der Teil der strace
Ausgabe, den Sie decodieren möchten, auf folgende Weise decodiert werden sollte:
write(1, "\0371", 21) ^ prefix that indicates consecutive octal output ^^^ three digits of octal output ^ literal character meaning "one"
Also das Präfix hier ist \0
aber nicht \
.
Du verwendest printf "%b" "\0371"
. Die allgemeine Form lautet printf FORMAT [ARGUMENT]…
und das man 1 printf
sagt FORMAT
Folgendes aus %b
:
%b
ARGUMENT
als String mit\
interpretierten Escape-Zeichen, außer dass oktale Escape-Zeichen die Form\0
oder haben\0NNN
Wie Sie sehen, ist das Präfix \0
wie in echo -e
. Die Interpretation geht jetzt so:
printf "%b" "\0371" ^^ prefix that indicates consecutive octal input ^^^ three octal digits
Dies erklärt Ihr falsches Ergebnis. Dasselbe Handbuch besagt jedoch, dass innere FORMAT
Oktalstellen etwas anders interpretiert werden:
\NNN
Byte mit OktalwertNNN
(1 bis 3 Ziffern)
Das Präfix ist \
genau wie in der Ausgabe von strace
. Scheint zusätzlich strace
darauf zu achten, wann das nächste Zeichen als Oktalziffer interpretiert werden kann. Vergleichen Sie:
$ strace -e write echo -ne '\037' write(1, "\37", 1) = 1 +++ exited with 0 +++
zu
$ strace -e write echo -ne '\037\101' write(1, "\37A", 21) = 2 +++ exited with 0 +++
zu
$ strace -e write echo -ne '\037\061' write(1, "\0371", 21) = 2 +++ exited with 0 +++
Beachten Sie die Führung 0
im letzten Fall. Es ist zu vermeiden, \371
welches als ein Byte interpretiert werden würde.
Es sieht so aus, als könnten Sie printf
zum Dekodieren der strace
Ausgabe verwenden, aber Sie sollten es als FORMAT
nicht weitergeben ARGUMENT
:
$ printf "\0371" | xxd -p 1f31
Aber andere Sequenzen, die in FORMAT
(zB %b
) interpretiert wurden, würden Sie in Schwierigkeiten bringen, also ist es besser, sich daran zu halten ARGUMENT
. Ich spielte mit, sed
um mich \
in \0
richtigen Fällen zu verwandeln, es wurde schnell mühsam; dann wurde mir klar %b
, FORMAT
dass auch andere sequenzen in interpretiert werden ARGUMENT
! Meiner Meinung nach ist das eine Sackgasse.
Fazit: Es ist viel besser, das Verhalten von zu ändern strace
. Versuchen Sie die Hex-Ausgabe:
$ strace -xx -e write echo -ne '\037\061' write(1, "\x1f\x31", 21) = 2 +++ exited with 0 +++
Dann
$ printf "%b" "\x1f\x31" | xxd -p 1f31