Correctly Escape echo -ne [closed]

0

Estou enviando um comando echo -ne para um arquivo no meu script de configuração para um mouse usb HID.

Aqui está o script, que é executado como root através de /etc/rc.local na inicialização:

#accidentally had a newline here <---  
#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p isticktoit
cd isticktoit
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "fedcba9876543210" > strings/0x409/serialnumber
echo "JW" > strings/0x409/manufacturer
echo "DoItForTheWenHua" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1" > configs/c.1/strings/0x409/configuration
echo 0x80 > configs/c.1/bmAttributes
echo 250 > configs/c.1/MaxPower
# Add functions here
mkdir -p functions/hid.usb0
echo 1 > functions/hid.usb0/protocol
echo 1 > functions/hid.usb0/subclass
echo 3 > functions/hid.usb0/report_length
# NEXT LINE CAUSES ISSUES 
echo -ne \x05\x01\x09\x02\xa1\x01\x09\x01\xa1\x00\x05\x09\x19\x01\x29\x03\x15\x00\x25\x01\x95\x81\x06\xc0\xc0 > functions/hid.usb0/report_desc
ln -s functions/hid.usb0 configs/c.1/
# End functions
ls /sys/class/udc > UDC

O resultado esperado do echo -ne é uma sequência de caracteres sendo gravados em funções de arquivo / hid.usb0 / report_desc iniciando com 0x05, 0x01, 0x09, etc. Em vez disso, obtive

$ cat /sys/kernel/config/usb_gadget/isticktoit/functions/hid.usb0/report_desc
-ne \x05\x01\x09\x02\xa1\x01\x09\x01\xa1\x00\x05\x09\x19\x01\x29\x03\x15\x00\x25\x01\x95\x81\x06\xc0\xc0

Quando tentei testar isso, não consegui reproduzi-lo. Executando o comando no bash (works):

pi@raspberrypi:~ $ echo -ne "\x05\x01\x09\x02\xa1\x01\x09\x01\xa1\x00\x05\x09\x19\x01\x29\x03\x15\x00\x25\x01\x95\x03\x75\x01\x81\x02\x95\x01\x75\x05\x81\x03\x05\x01\x09\x30\x09\x31\x15\x81\x25\x7f\x75\x08\x95\x02\x81\x06\xc0\xc0"
        ▒       ▒       )%▒u▒▒u▒        0       1▒▒▒▒▒

Execução de um script de teste (trabalhos):

pi@raspberrypi:~ $ cat test
        ▒       ▒       )%▒u▒▒u▒        0       1▒▒▒▒▒
pi@raspberrypi:~ $ cat test.sh
#!/bin/bash

echo -ne "\x05\x01\x09\x02\xa1\x01\x09\x01\xa1\x00\x05\x09\x19\x01\x29\x03\x15\x00\x25\x01\x95\x03\x75\x01\x81\x02\x95\x01\x75\x05\x81\x03\x05\x01\x09\x30\x09\x31\x15\x81\x25\x7f\x75\x08\x95\x02\x81\x06\xc0\xc0" > test
pi@raspberrypi:~ $ ./test.sh
pi@raspberrypi:~ $ cat test
        ▒       ▒       )%▒u▒▒u▒        0       1▒▒▒▒▒P

Redirecionamento de Bash (trabalhos):

pi@raspberrypi:~ $ echo -ne "\x05\x01\x09\x02\xa1\x01\x09\x01\xa1\x00\x05\x09\x19\x01\x29\x03\x15\x00\x25\x01\x95\x03\x75\x01\x81\x02\x95\x01\x75\x05\x81\x03\x05\x01\x09\x30\x09\x31\x15\x81\x25\x7f\x75\x08\x95\x02\x81\x06\xc0\xc0" > test
pi@raspberrypi:~ $ cat test
        ▒       ▒  )%▒u▒▒u▒        0       1▒▒▒▒▒

Então, o que eu fiz de errado aqui?

Resposta: Eu não coloquei o shebang na linha certa, ele causou outro shell para interpretar o meu script.

    
por James Meas 10.07.2018 / 10:30

1 resposta

3

O comportamento de echo é notoriamente não transportável. Seu script provavelmente é executado com algum outro shell quando não funciona. (Você não está executando sh scriptname , está?) Veja, por exemplo como echo difere em Bash e Dash:

$ bash -c 'echo -ne \x41\x42\x43\x0a'
ABC

$ dash -c 'echo -ne \x41\x42\x43\x0a'
-ne \x41\x42\x43\x0a

Normalmente, é melhor usar printf , mas isso não ajuda, pois nem todos os printf s suportam escape de caractere hexadecimal ( \x00 ), apenas octais ( printf \x41\x42\x43\x0a0 ), então você precisa mudar o conteúdo também. Em qualquer caso, no Bash echo -en \x41\x42\x43\x0a faria o mesmo que o %code% do Bash, mas um pouco mais portável.

Você precisará verificar qual shell executa o script.

Veja também: Por que o printf é melhor que o eco?

    
por 10.07.2018 / 11:05