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 ...
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.
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:
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