este comando fez o trabalho
printf '\x0f\x11' | program
Eu tenho um programa que requer alguns caracteres não imprimíveis como 0x0F ( ctrl + o ) como entrada para executar a parte pretendida o programa.
0 000 00 NUL � Null char
1 001 01 SOH  Start of Heading
2 002 02 STX  Start of Text
3 003 03 ETX  End of Text
4 004 04 EOT  End of
E está sendo executado na linha de comando, alguma idéia de como inserir caracteres não imprimíveis na linha de comando como entrada de um programa?
O utilitário printf suporta escapes de caracteres octais:
- In addition to the escape sequences shown in XBD File Format Notation (
'\','\a','\b','\f','\n','\r','\t','\v'),"\ddd", where ddd is a one, two, or three-digit octal number, shall be written as a byte with the numeric value specified by the octal number.
O printf embutido em pelo menos Bash e Zsh também suporta sequências de escape hexadecimais \xHH e também as $'...' quotes, que interpelam as sequências de escape de forma semelhante.
Então, para usar esses caracteres em argumentos de linha de comando para algum comando, faça algo assim:
$ somecmd "arg_with_$(printf '7')_xoff"
ou coloque-o em uma variável se você precisar usar o caractere mais de uma vez
$ xoff=$(printf '7')
$ somecmd "many${xoff}odd${xoff}chars"
Ou, para canalizar os dois bytes 0x0f 0x11 ( 017 021 em octal) para um comando como mencionado nos comentários:
$ printf "\x0f\x11" | somecmd...
$ printf "71" | somecmd...
Isso depende do shell; O ZSH oferece um $\NNN form
% perl -e 'printf "%vx\n", shift' $'7'
7f
%
Em zsh e ksh , outra opção seria usar control + v e, em seguida, retornar , o que deve inserir ^M na linha de comando, embora isso possa ser entediante e possa complicar demais o histórico do shell.
Na falta deles, outra opção é rodar um programa que emite os caracteres apropriados
% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
%
Ou para usar um pequeno programa em C com os argumentos apropriados para o seu programa; isso evitará complicações que o shell possa adicionar
#include <err.h>
#include <unistd.h>
int main(void)
{
execlp("perl", "perl", "-e", "printf \"%vx\n\", shift", "\x0F",
(char *) 0);
err(1, "exec failed");
return 1;
}
Tags command-line input standard