Os shells que não são Bash e Zsh suportam aspas ANSI-C? por exemplo. $ 'string'

7

Eu tenho um script de shell que usa o seguinte para imprimir uma marca de seleção verde em sua saída:

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

Após ler sobre as citações ANSI-C do Bash, percebi que podia use-o ao definir minhas variáveis de cor e remover o sinalizador -e do meu echo .

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

Isso parece atraente, já que significa que a mensagem é impressa corretamente, quer seja passada para o arquivo Bash's echo , ou para o utilitário externo /bin/echo (estou no macOS).

Mas isso torna o script menos portável? Eu sei que Bash e Zsh apóiam esse estilo de citar, mas não tenho certeza sobre os outros.

    
por ivan 18.06.2017 / 19:35

1 resposta

6

$'…' é um recurso ksh93 que também está presente em zsh e bash e em algumas compilações do BusyBox sh (cinza de BusyBox construída com ENABLE_ASH_BASH_COMPAT ). Não está presente no sh simples. Os shells comuns que não o possuem incluem o traço (que é /bin/sh no Ubuntu, entre outros) e algumas compilações do BusyBox.

Uma maneira portátil de obter backslash-letter e backslash-octal analisados como caracteres de controle é usar printf . Está presente em todos os sistemas compatíveis com POSIX.

esc=$(printf '3')
col_green="${esc}[32;01m"

Observe que \e não é portátil. É suportado por muitas implementações de printf , mas não pelo de traço. Use o código octal em vez disso.

    
por 19.06.2017 / 01:07