Command-Line
不可列印的字元作為命令行中的輸入
我有一個程序需要一些不可列印的字元,例如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
它正在命令行上執行,知道如何將不可列印的字元插入命令行作為程序的輸入嗎?
該
printf
實用程序支持八進製字元轉義:
- 除了 XBD 文件格式符號 (
'\\'
,'\a'
,'\b'
,'\f'
,'\n'
,'\r'
,'\t'
,'\v'
)中顯示的轉義序列外"\ddd"
,其中ddd是一位、兩位或三位八進制數,應寫為一個字節,其數值由八進制數。
printf
至少 Bash 和 Zsh 中的內置函式還支持十六進制轉義序列\xHH
以及$'...'
引號,它們類似地插入轉義序列。因此,要在某些命令的命令行參數中使用此類字元,請執行以下操作:
$ somecmd "arg_with_$(printf '\017')_xoff"
如果您需要多次使用該字元,則將其放入變數中
$ xoff=$(printf '\017') $ somecmd "many${xoff}odd${xoff}chars"
或者,將兩個字節
0x0f 0x11
(017 021
八進制)傳遞給註釋中提到的命令:$ printf "\x0f\x11" | somecmd... $ printf "\017\021" | somecmd...
這取決於外殼;ZSH提供
$\NNN
表格% perl -e 'printf "%vx\n", shift' $'\177' 7f %
在這兩個選項中
zsh
,ksh
另一個選項是使用control+v
and thenreturn
which 應該將 a 插入^M
命令行,儘管這可能很乏味並且可能會使 shell 歷史過於復雜。缺少這些,另一種選擇是執行發出適當字元的程序
% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' ) f %
或者為您的程序使用帶有適當參數的小型 C 程序;這將避免 shell 可能添加的任何並發症
#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; }