printf в сценарии оболочки не может выполнить \ x% x

Я думаю, что требования предъявляются не к заголовкам ядра, а к пакету kernel-devel. Пакет kernel-devel предоставит вам модули .ko. Посмотрите, поможет ли вам выполнение apt-get install для пакета ядра devel?

2
30.08.2018, 14:32
2 ответа

\используется там несколько раз:

  • для формы подстановки команд `...`. Лучше всего использовать $(...).
  • для экранирования таких символов, как $, `и \внутри двойных кавычек. Вместо этого лучше использовать одинарные кавычки.
  • для экранирования \в аргументе форматаprintf
  • ввести эту \xHHпоследовательность в аргумент формата другогоprintf(не стандартного хотя ).

Так и должно быть:

printf `printf "\\\\\\\\x%x" 255 255 255 0`
printf `printf '\\\\x%x' 255 255 255 0`
printf $(printf '\\x%x' 255 255 255 0)

То есть вам нужно передать \\в самый правый printf, чтобы он вывел \, но с `...`вам нужно экранировать каждый \с \и сделать что снова для "...".

Это по-прежнему вызов оператора split+glob, который нам здесь не нужен.Так:

printf "$(printf '\\x%x' 255 255 255 0)"

Или портативный:

printf "$(printf '\\%o' 255 255 255 0)"

С некоторыми awkреализациями (не все работают с 0):

LC_ALL=C awk 'BEGIN{printf "%c%c%c%c", 255, 255, 255, 0}'

Сperl:

perl -e 'print pack "C*", @ARGV' 255 255 255 0

zshальтернатива, позволяющая избежать разветвления подоболочки:

(){setopt localoptions nomultibyte; printf %s ${(#)@}} 255 255 255 0

bashальтернатива, которая позволяет избежать разветвления подоболочки (также работает в последних версияхzsh):

printf -v x '\\%o' 255 255 255 0
printf "$x"
3
27.01.2020, 22:09

Я только что снова столкнулся с той же проблемой, и на этот раз я не смог реорганизовать входные данные, чтобы сделать это decimal.

Если никто другой не может показать обратное, внутренний printfв BASH в режиме SH можетне печатать символы "\xFF", несмотря на то, что говорится в руководстве и на страницах справки. Я бы сказал, что это ошибка, по крайней мере, в BASH.

#!/bin/sh
printf "\x46\x47"

Если вы удалите кавычки из строки, оболочка уберет их без обработки части x.

Что тогда работает?:

#!/bin/sh
PF=`which printf`
$PF "\x46\x47"

Таким образом, текущее решение, если у вас есть только шестнадцатеричныйкактекст , и вы хотите символ или байт , передать каждый (текст )байт в файл скрипта (, как показано во втором коде )с \xдобавленным (перед )каждым значением, chmodскрипт внутри вашего скрипта, затем выполнить сценарий на следующей строке и удалить сценарий, если это необходимо.

0
27.01.2020, 22:09

Теги

Похожие вопросы