Saya mencoba melakukan beberapa trik dengan dd. Saya pikir akan mungkin untuk menyimpan beberapa nilai hexa dalam variabel yang disebut "header" untuk menyalurkannya ke dd.
Langkah pertama saya tanpa variabel adalah ini:
$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex
00000000 36 c9 da 00 b4 |6....|
00000005
Setelah itu saya coba ini:
$ header=$(echo -ne "\x36\xc9\xda\x00\xb4")
$ echo -n $header | hd
00000000 36 c9 da b4 |6...|
00000004
Seperti yang Anda lihat, saya kehilangan \x00
nilai saya dalam $header
variabel. Adakah yang punya penjelasan untuk perilaku ini? Ini membuatku gila.
linux
bash
shell-script
dd
jujur
sumber
sumber
bash: warning: command substitution: ignored null byte in input
.header="$(echo -ne "\x36\xc9\xda\x00\xb4")"; echo -n "$header" | hd
namun ini hanya memberikan hasil yang sama.header="\x36\xc9\xda\x00\xb4"; echo -n "$header" | hd
, tetapi tidak sama dengan menyimpan bentuk yang dapat dibaca manusia.Jawaban:
Anda tidak dapat menyimpan byte nol dalam string karena Bash menggunakan string gaya-C, yang menyimpan byte null untuk terminator. Jadi, Anda perlu menulis ulang skrip Anda untuk hanya mem-pipe urutan yang berisi byte nol tanpa Bash perlu menyimpannya di tengah. Misalnya, Anda dapat melakukan ini:
Perhatikan, omong-omong, bahwa Anda tidak perlu
echo
; Anda dapat menggunakan Bashprintf
untuk ini banyak tugas sederhana lainnya.Atau alih-alih merantai, Anda dapat menggunakan file sementara:
Tentu saja, ini memiliki masalah bahwa file tersebut
/tmp/mysequence
mungkin sudah ada. Dan sekarang Anda harus terus membuat file sementara dan menyimpan path mereka dalam string.Atau Anda dapat menghindarinya dengan menggunakan proses substitusi:
The
<(command)
Operator menciptakan pipa bernama dalam sistem file, yang akan menerima output daricommand
.hd
akan menerima, sebagai argumen pertamanya, jalur ke pipa itu — yang akan dibuka dan dibaca hampir seperti file apa pun. Anda dapat membaca lebih lanjut tentang ini di sini: /unix//a/17117/136742 .sumber
zsh
akan melakukannya, tetapi hanya dalam mode nōn-POSIX.) Saya benar-benar melihatnya karena saya bertanya-tanya apakah layak untuk menerapkan ini dimksh
...sh
emulasi,\0
tidak dalam nilai default$IFS
.echo "$(printf 'a\0b')"
masih berfungsi OK dalamsh
persaingan dalamzsh
.Anda bisa menggunakan
zsh
yang merupakan satu-satunya shell yang dapat menyimpan karakter NUL dalam variabel-variabelnya. Karakter itu bahkan ada dalam nilai default$IFS
inzsh
.Atau:
Atau
Atau
Namun perhatikan bahwa Anda tidak dapat meneruskan variabel seperti argumen atau variabel lingkungan ke perintah yang dieksekusi karena variabel argumen dan lingkungan adalah string yang dibatasi NUL yang diteruskan ke
execve()
panggilan sistem (batasan API sistem, bukan shell ). Dalamzsh
, namun Anda dapat lulus NUL byte sebagai argumen untuk fungsi atau builtin perintah.sumber
zsh
sintaks dalam pertanyaan Anda.echo -n $header
berarti melewatkan konten$header
variabel sebagai argumen terakhirecho -n
adalahzsh
(fish
ataurc
ataues
) sintaks, bukanbash
sintaks. Dalambash
, itu memiliki arti yang sangat berbeda . Lebih umumzsh
sepertiksh
(bash
, shell GNU, yang kurang lebih merupakan bagian-klon dariksh
, shell Unix de-facto) tetapi dengan sebagian besar keanehan desain dari shell Bourne yang diperbaiki (dan banyak fitur tambahan, dan banyak lebih user-friendly / kurang mencengangkan).echo $(printf 'ab\0cd') | od -vAn -tx1c
mencetak `61 62 20 63 64 0a`, itu adalah ruang di mana NUL seharusnya ada.