명령줄에 인쇄할 수 없는 문자를 입력하세요.

명령줄에 인쇄할 수 없는 문자를 입력하세요.

인쇄할 수 없는 문자가 필요한 프로그램이 있습니다.0x0F( ctrl+ o)는 프로그램의 의도된 부분을 실행하기 위한 입력입니다.

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 

명령줄에서 실행됩니다. 인쇄할 수 없는 문자를 프로그램 입력으로 명령줄에 삽입하는 방법을 아시나요?

답변1

printf유틸리티는 8진 문자 이스케이프를 지원합니다.

  1. XBD 파일 형식 표기법( '\\', '\a', '\b', '\f', '\n', '\r', '\t') '\v'에 표시된 이스케이프 시퀀스 "\ddd"외에도디디8진수로 지정된 값으로 바이트를 써야 하는 1자리, 2자리 또는 3자리 8진수입니다.

printf최소한 Bash와 Zsh의 내장 기능은 16진수 이스케이프 시퀀스 \xHH$'...'유사한 방식으로 이스케이프 시퀀스를 삽입하는 따옴표도 지원합니다.

따라서 특정 명령의 명령줄 인수에 이러한 문자를 사용하려면 다음을 수행하십시오.

$ somecmd "arg_with_$(printf '\017')_xoff"

또는 해당 문자를 여러 번 사용해야 하는 경우 변수에 넣으세요.

$ xoff=$(printf '\017')
$ somecmd "many${xoff}odd${xoff}chars"

또는 주석에 언급된 명령에 2바이트 0x0f 0x11( 8진수)를 전송합니다.017 021

$ printf "\x0f\x11" | somecmd...
$ printf "\017\021" | somecmd...

답변2

$\NNN이는 ZSH가 제공하는 형식 에 따라 다릅니다.

% perl -e 'printf "%vx\n", shift' $'\177'
7f
% 

두 가지 옵션 중 zsh또 다른 ksh옵션은 a를 사용한 control+v다음 명령줄에 삽입하는 return것입니다 . 하지만 이는 지루할 수 있고 쉘 기록을 지나치게 복잡하게 만들 수 있습니다.^M

이것이 누락된 경우 또 다른 옵션은 적절한 문자를 내보내는 프로그램을 실행하는 것입니다.

% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
% 

또는 귀하의 프로그램에 적합한 매개변수가 있는 작은 C 프로그램을 사용하면 쉘이 추가할 수 있는 합병증을 피할 수 있습니다.

#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;
}

답변3

이 명령이 작업을 수행했습니다.

printf '\x0f\x11' | program

관련 정보