Atribuindo variáveis maiúsculas aos comandos

3

Enquanto tentava decifrar alguns scripts escritos por ex-funcionários da minha empresa atual, em muitos dos scripts, me deparei com as seguintes instruções que atribuem variáveis a alguns comandos, conforme mostrado abaixo:

CAT=cat
GREP=grep
SED=sed

Mais tarde, no script, vejo que eles usaram essas variáveis em vez dos comandos normais:

$GREP -v "^#" 'dirname $0'/abcdfilename | while read line
do
<some loop operations>
done

Não vejo razão em usar essa variável em vez de usar grep diretamente. Minhas perguntas são:

  • Existe um ponto em fazer o grep ou sed (no nosso caso) dessa maneira?
  • Esse é o resultado de alguém tentar escrever um roteiro com a intenção de dificultar o entendimento de outra pessoa?
  • Ou isso é apenas um exemplo de script ruim?
por Sree 18.02.2016 / 06:09

3 respostas

2

Há um argumento para fazer praticamente qualquer coisa que você use repetidamente ao longo de um script em um varuable, porque você pode redefini-lo uma vez e fazer com que ele se espalhe pelo resto do script.

Você pode argumentar que basicamente a mesma coisa pode ser feita com uma pesquisa / substituição simples, mas muitos usuários são cautelosos com a pesquisa / substituição, já que não é tão difícil substituir acidentalmente algo que você não pretende substituir.

Na verdade, sugiro essa melhoria em relação à versão existente:

GREP=${GREP:-/bin/grep}

, o que significa que o GREP será configurado para o que o usuário configurar no shell, ou se NÃO estiver configurado, em seguida, para / bin / grep

Dessa forma, um usuário pode substituir 'grep' instantaneamente.

$ export GREP=/bin/fgrep
$ ./path/to/script.sh
    
por 18.02.2016 / 22:48
6

Existem diferentes implementações para um comando padrão, em um sistema. Como no Solaris 10 e anterior, você tem /bin/sh é o shell Bourne antigo e /usr/xpg4/bin/sh é shell compatível com POSIX. Ou no OSX, você tem o BSD sed ao chamar sed e o GNU sed ao chamar gsed . Você pode escolher qual implementação você deseja usar em seu script.

Portanto, é mais fácil alterar a implementação do script quando você usou a variável. Quando você quer o GNU sed:

SED=gsed

Se você não usar variável, deverá substituir todas as ocorrências de sed no seu script. Embora você possa fazer isso facilmente, isso é considerado uma prática ruim de programação.

    
por 18.02.2016 / 08:26
1

É provavelmente um exemplo de otimização prematura.

Quantas alternativas essa máquina ou qualquer máquina tem para sed , grep e awk ? Eu apostaria que a média universal é próxima de 1.0. Dadas duas opções em uma máquina específica, quais são as chances de que as implementações sejam diferentes, de modo que o script falhe com a versão encontrada no PATH e funcione com a outra? Se isso acontecer, é mais provável que a solução altere o script ou o PATH? Se a mudança do script for a resposta, quais são as chances de encontrar pelo menos uma invocação de grep em vez de $ GREP ? O baralho é empilhado contra a necessidade de qualquer indireção, e contra ele funcionando como pretendido, se alguma vez for necessário.

Eu não lutaria contra a cultura. Se houver alguma preferência em sua loja para $ GREP ou / usr / bin / grep ou apenas para grep , provavelmente concordaria em recebê-lo ao longo. Caso contrário, KISS: evite indireção até que surja a necessidade.

    
por 18.02.2016 / 22:39