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