script bash dependente de locale: Como garantir apropriadamente a localidade?

2

Eu passei por um bug estranho em um script bash que está em outra máquina, acessada via ssh (ou outros clientes semelhantes a ssh).

Era basicamente um menu, em particular mostrando o (s) endereço (s) IP da máquina em que está hospedado.

A parte importante é esse código:

#!/bin/bash

function int-ips { /sbin/ifconfig |grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'; }

echo $(int-ips)

(Eu apenas copiei e coleii a função acima de link )

Ele estava funcionando perfeitamente no F19, no Mac OS X. Em seguida, outro colega o experimentou em seu OS X e, surpresa !, nada foi impresso. O script ainda estava sendo executado na mesma máquina, apenas acessado pelo ssh de outro cliente.

Demorei algum tempo para entender que era um problema de localização: a linguagem da última máquina NÃO era inglesa, e a função usada para recuperar o endereço IP usava um "link grep", a palavra "link" que acontecia ser traduzido para ifconfig com outras localidades, pelo menos a que meu colega estava usando.

Percebendo a existência de uma terrível fonte de bugs, quero saber como me proteger adequadamente contra esse tipo de problema de dependência local. Por exemplo, sei que usarei o comando "file" para aprender tipos de arquivos sobre entradas e que provavelmente usarei "grep" para analisar os resultados.

Minha solução:

Adicione isso ao início do meu script:

export LANG=C
export LC_ALL=C

(ou en_US.utf8 em vez de C talvez)

Minha solução provavelmente mais limpa que farei depois:

  1. SALVAR LANG atual e LC_ALL
  2. export LANG = C; exportação LC_ALL = C
  3. executar meu código dependente de localidade
  4. restaura a localidade do usuário salva em 1)

Minhas perguntas:

A) Esta correção está ok? Quer dizer, há algum codificador bash / nix experiente que possa me alertar sobre algum perigo que eu não vejo em usar esse método? (quanto mais eu me coloco no nix / nux, mais tenho certeza do nada : P)

B) Existe uma maneira mais elegante / mais elegante de fazer tudo isso?

P.S. FYI, mas não relevante, IMHO:
A máquina que hospeda o script está em uma VM com o Centos 6.4.
As máquinas das quais acessamos a VM estão no Fedora 19 ou no Mac OS X via ssh-terminal ou no Windows 7 via Putty

    
por Lioobayoyo 26.11.2013 / 15:51

1 resposta

1

Prefacing o comando com o env vars diretamente faz com que ele seja usado apenas pela duração do comando, o que pode ou não ser adequado, dada a aplicação final.

LC_MESSAGES=C /sbin/ifconfig | grep ...
    
por 26.11.2013 / 15:57

Tags