grep é inconsistente para grep -P?

5

Eu tenho um script que faz algumas tarefas domésticas que funciona perfeitamente bem quando invocado de um shell interativo, mas não fez nada quando invocado pelo cron. Para solucionar isso, iniciei um shell com um ambiente 'em branco' com o comando:

env -i /bin/bash --noprofile --norc

Usando este env em branco, eu procurei no meu script e descobri que o seguinte grep não corresponderá a nenhum arquivo:

grep -il "^ws_status\s*=\s*[\"']remove[\"']$"

No entanto, quando executado a partir de um shell interativo, o comando retornará os nomes dos arquivos correspondentes.

Como nota, a expressão corresponde a linhas como: WS_STATUS = "remove"

Por meio de tentativa e erro, descobri que adicionando -P às opções [Perl regex], o comando começou a funcionar normalmente no shell 'em branco'. No entanto, eu tenho nenhuma idéia porque meu shell de login parece ser padronizado para grep -P .

  • Existe apenas um grep binário, /bin/grep
  • Não há alias definidos para grep=pgrep ou grep="grep -P"
  • Não há variável de env GREP_OPTIONS definido.

Qual é o problema aqui?

Nota: OS é RHEL v5.10, Bash é v3.2.25, grep é v2.5.1

    
por Sammitch 24.10.2013 / 19:41

1 resposta

2

Alguma dessas variáveis é et?

GREP_OPTIONS, LC_ALL, LC_COLLATE, LANG, LC_CTYPE, LC_MESSAGES ou POSIXLY_CORRECT

Qualquer um deles pode afetar o comportamento do grep.

Uma coisa que você pode tentar é "set -x" para ver os comandos individuais que são executados. Você também pode mover os comandos para um script de shell e chamá-lo do cron. Dessa forma, você pode adicionar comandos como set , env e set -x com mais facilidade.

#!/bin/bash
echo SET
set
echo ENV
env
set -x
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
exit
    
por 20.08.2016 / 09:26