Należy pamiętać, że dd
jest surowy interfejs do read()
, write()
i lseek()
wywołanie systemowe. Można go używać tylko w sposób niezawodny, aby wyodrębnić fragmenty danych ze zwykłych plików, zablokować urządzenia i niektóre urządzenia znakowe (np. /dev/urandom
), Czyli pliki, których read(buf, size)
powrót jest gwarantowany, size
dopóki nie zostanie osiągnięty koniec pliku.
W przypadku potoków, gniazd i większości urządzeń znakowych (takich jak ttys) nie masz takiej gwarancji, chyba że zrobisz read()
to w rozmiarze 1 lub użyjesz dd
rozszerzenia GNU iflag=fullblock
.
Więc albo:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Lub:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Lub z powłokami z wbudowanym wsparciem dla operatora wyszukiwania, takiego jak ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Lub zsh
(zakładając, że head
obsługuje tę -c
opcję tutaj):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
), więc systemy plików, które dokonują opóźnionego przydzielania (jak XFS), mają najmniejszą szansę na stwierdzenie, że plik jest zapisywany, gdy jest jeszcze wiele do zrobienia.