Não-ascii na linha de comando do Cygwin bash causa erro

4

Eu estou chamando bash de cmd.exe como este

c:\cygwin\bin\bash --login -c "echo ф"

e entre no Cygwin 2.8.0

/usr/bin/bash: echo ф: command not found

Ele trata o parâmetro como parte do nome do comando. Fazendo o mesmo no Cygwin 2.5.2 eu recebo a saída ф .

    
por giraffes 26.04.2017 / 17:27

2 respostas

7

Como isso costumava funcionar, e funciona bem para pessoas que estão executando o bash no Unices (eu testei no Debian aqui), acho que você encontrou um bug do Cygwin. O projeto Cygwin tem uma página sobre relatórios de erros do Cygwin . Eles têm um monte de informações úteis e passos por lá, tempo demais para resumir aqui.

Nesse meio tempo, eu suspeito que você possa contornar isso escapando do personagem. O echo do Bash, quando recebe o sinal -e , interpreta várias seqüências de escape:

c:\cygwin\bin\bash --login -c "echo -e '\xd1\x84'"

deve funcionar. Hexadecimal D1 84 é a codificação UTF-8 de ф. Se você tiver a ferramenta unicode , ela informará a você, mas apenas fará o eco do caractere em od ou xxd :

$ echo -n 'ф' | od -t x1
0000000 d1 84
0000002

$ echo -n 'ф' | xxd -p
d184

O FAQ do Cygwin me diz que usa o UTF-8 por padrão, então isso deve funcionar. Mas é claro que você também pode usar outras codificações (acho que O Windows usa principalmente o UTF16le :

$ echo -n 'ф' | iconv -t utf16le | xxd -p
4404
    
por 26.04.2017 / 18:20
1

Isso acontece porque o cmd.exe adiciona um par adicional de aspas ao redor dos argumentos com caracteres não-ASCII. Então, o que realmente chega ao aplicativo cygwin é o seguinte: %código% Então o bash pode interpretar ' C:\cygwin\bin\bash --login -c "echo blo" arg0: /usr/bin/bash arg1: --login arg2: -c arg3: echo blo ', mas: %código% Agora o bash não reconhece ' echo blo '.

    
por 02.05.2018 / 16:45

Tags