Question De manière inconsistante, grep est par défaut grep -P?


J'ai un script qui fait du ménage qui fonctionne parfaitement bien lorsqu'il est appelé à partir d'un shell interactif, mais qui ne fait rien lorsqu'il est appelé par cron. Pour résoudre ce problème, j'ai démarré un shell avec un environnement «vide» avec la commande:

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

En utilisant cet env vierge, j'ai creusé dans mon script et constaté que grep ne correspondra à aucun fichier:

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

Cependant, lorsqu'elle est exécutée à partir d'un shell interactif, la commande renvoie les noms de fichier des fichiers correspondants.

En tant que note, l'expression correspond à des lignes telles que: WS_STATUS = "remove"

Par essais et erreurs, j'ai découvert que l'ajout de -P Pour les options [regex Perl] la commande a commencé à fonctionner normalement dans le shell "vierge". Cependant, j'ai aucune idée pourquoi mon shell de connexion semble être par défaut grep -P.

  • Il n'y a qu'un seul grep binaire, /bin/grep
  • Il n'y a pas d'alias définis pour grep=pgrep ou grep="grep -P"
  • Il n'y a pas de variable env GREP_OPTIONS défini.

Quel est le problème ici?

Remarque: OS correspond à RHEL v5.10, Bash à v3.2.25, grep à v2.5.1.


5
2017-10-24 17:41


origine


donc dans votre shell interactif, which grep résultats grep -P? Avez-vous fait un grep récursif pour "grep -P" dans /etc/profile*? - Petter H
@ PetterH which grep résultats /bin/grep, et grep -ri grep /etc/profile* n'en imprime que quelques utilisations dans les scripts. - Sammitch
Plutôt que which grep peux-tu essayer type grep. - Mark Wagner
@ MarkWagner grep is hashed (/bin/grep) - Sammitch
Je n'ai pas assez de rep pour commenter, mais est-ce que ça aide si vous utilisez \grep avec une barre oblique inverse, au lieu de grep? Je sais que vous avez déjà dit que ce n’était pas un alias, mais cela devrait utiliser un grep sans alias. - sinisterstuf


Réponses:


Est-ce que l'une de ces variables et?

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

N'importe lequel d'entre eux pourrait affecter le comportement de grep.

Une chose que vous pourriez essayer est "set -x" pour voir les commandes individuelles qui sont exécutées. Vous pouvez également déplacer les commandes dans un script shell et appeler cela à partir de cron. De cette façon, vous pouvez plus facilement ajouter des commandes comme set, env, et set -x plus facilement.

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

2
2017-08-20 07:26