Я делал это с помощью xxd
echo -n 5a | xxd -r -p
Но потом я понял, что в Debian / Ubuntu xxd является частью vim-common и, следовательно, может отсутствовать в минимальной системе. Чтобы также избежать perl (imho также не является частью минимальной системы), я использовал sed, xargs и printf следующим образом:
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
В основном я хочу преобразовать только несколько байтов, и это нормально для таких задач. Преимущество этого решения перед ghostdog74 заключается в том, что оно может автоматически преобразовывать шестнадцатеричные строки произвольной длины. xargs используется, потому что printf не читает со стандартного ввода.