[grep] Comportement étrange (résolu)

Questions et astuces concernant l'installation et la configuration d'archlinux
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

[grep] Comportement étrange (résolu)

Message par karhu »

Bonjour
Sur mes quatre PC (deux portables et deux tours) trois réagissent bien à la commande grep :

Code : Tout sélectionner

env $PATH | grep -c /usr/bin
1
et le dernier :

Code : Tout sélectionner

env $PATH | grep -c /usr/bin
env: .:/usr/bin:/usr/local/sbin:/usr/local/bin:/opt/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl: Aucun fichier ou dossier de ce type
0
Toutes les machines sont au même niveau logiciel

Code : Tout sélectionner

yaourt -Q grep
core/grep 2.21-2 (base base-devel) installé le 06 mars 2015
Le problème existait déjà depuis un petit moment sans avoir été identifié. En gros j'utilise le résultat d'une commande grep dans un petit programme en python qui plante sur cette machine et pas sur les autres.
Ou un petit souci dans bash avec les variables systèmes ? Car la commande suivante fonctionne :

Code : Tout sélectionner

env | grep -c /usr/bin
2
Normal dans $PATH et $_. Ou alors c'est moi ? :mrgreen:
Dernière modification par karhu le lun. 09 mars 2015, 16:13, modifié 1 fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange

Message par benjarobin »

Bonjour,
Je dirais juste que la commande : env $PATH n'a juste pas de sens... Quelle est ton but ?
Je te conseil vivement la lecture du man de env... Mais en résumé, env s'utilise de cette façon : env options programme arguments
Tu ne spécifies aucune option, donc ici programme vaut $PATH

Les 2 commandes suivantes sont identiques : $ env programme et $ programme

Donc en résumé tu essayes de lancer le programme $PATH avec l'environnement courant.

Je pense que ce que tu veux faire c'est ceci : echo $PATH | grep -c /usr/bin
Voir mieux ceci : echo $PATH | grep -q /usr/bin et regarder le code de retour/d'erreur de grep, au lieu de lire la sortie standard de grep
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange

Message par karhu »

Le but est de savoir dans mon .bash_profile si $HOME/bin est déjà dans PATH et si non le rajouter, si le répertoire existe.
benjarobin a écrit :Je dirais juste que la commande : env $PATH n'a juste pas de sens
Peut-être n'empêche que le comportement est différent sur les machines.
D'accord je peux aussi utiliser la commande echo :
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange

Message par benjarobin »

karhu a écrit :Peut-être n'empêche que le comportement est différent sur les machines.
C'est juste que le contenu de $PATH n'est pas le même sur tes PC.
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange

Message par karhu »

Avec echo $PATH | grep -c /usr/bin plus un test sur la valeur retournée cela fonctionne et avec if [ `echo ${PATH} | grep -q /usr/bin` ] aussi bien sûr.
Les PATH sont très proches sur toutes mes machines, pour ne pas dire identiques et c'est ce comportement différent qui me gêne.
Si grep n'est pas en cause, je vais clore ce post et en rouvrir un pour mon programme en python.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange (résolu)

Message par benjarobin »

Peux tu donner le contenu de $PATH de l'ensemble de tes machines ? Je serais curieux d'avoir la sortie de

Code : Tout sélectionner

echo $PATH
which env
alias env
$PATH
Pour moi cela n'a rien à voir avec ton programme en python, et tu as de mon point de vue 3 PC qui ont un comportement étrange...
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange (résolu)

Message par karhu »

Je n'ai que trois machines en service pour le moment donc pour les trois :

Code : Tout sélectionner

which env
/usr/bin/env
alias env
bash: alias: env : non trouvé
une bonne portable 32:

Code : Tout sélectionner

env $PATH
env: .:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl: Aucun fichier ou dossier de ce type
$PATH
bash: .:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl: Aucun fichier ou dossier de ce type
une autre bonne tour 64

Code : Tout sélectionner

env $PATH
env: .:/usr/bin:/usr/local/sbin:/usr/local/bin:/opt/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/iohan/bin: Aucun fichier ou dossier de ce type
$PATH
bash: .:/usr/bin:/usr/local/sbin:/usr/local/bin:/opt/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/iohan/bin: Aucun fichier ou dossier de ce type
la bizarre tour 64 :

Code : Tout sélectionner

env $PATH
env: .:/usr/bin:/usr/local/sbin:/usr/local/bin:/opt/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl: Aucun fichier ou dossier de ce type
$PATH
bash: .:/usr/bin:/usr/local/sbin:/usr/local/bin:/opt/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl: Aucun fichier ou dossier de ce type
Voici la ligne de commande qui fonctionne dans des cas et pas dans l'autre :

Code : Tout sélectionner

if ! echo ${PATH} | grep -q $HOME/bin;
Dernière modification par karhu le lun. 09 mars 2015, 17:13, modifié 1 fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange (résolu)

Message par benjarobin »

Tu te rend compte que la sortie est la même (ou presque) sur les 3 machines ? Tu as la même erreur...
Donc il est impossible que même avec grep tu ne vois pas l'erreur... Ou alors je ne sais pas comment tu as fait mais la sortie d'erreur est redirigée vers la sortie standard...

Peux tu donner d'une des machines "bizarres" (les machines où ta commande initiale fonctionne) le contenu, si tu utilises bash, de

Code : Tout sélectionner

cat ~/.bashrc
cat ~/.bash_profile
cat /etc/bash.bashrc
cat /etc/profile
cat /etc/profile.d/*
Edit (suite à ton edit): Tu veux dire que cette commande

Code : Tout sélectionner

if ! echo ${PATH} | grep -q $HOME/bin ; then echo ok; fi
ne donne pas toujours juste ok
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange (résolu)

Message par karhu »

Oui.
Voilà mon programme de test

Code : Tout sélectionner

#!/bin/bash
 
if [ -d $HOME/bin ];
then
#  if [ `echo ${PATH} | grep -c $HOME/bin` -eq 0 ];
  if ! echo ${PATH} | grep -q $HOME/bin;
#  if [ `echo ${PATH} | grep -c /usr/bin` -eq 0 ];
#  if echo ${PATH} | grep -q /usr/bin;
  then
    echo -e "\n Le chemin n'est pas dans le PATH !\n";
  else
    echo -e "\n Le chemin est déjà dans le PATH :\n";
  fi
fi
#
Pour les cas /usr/bin la comparaison le donne dans le PATH mais le retour du deuxième test. Étrange non ! Si tu veux je peux te faire voir le passage du code python à l'origine de la découverte du problème (si problème il y a ?).
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange (résolu)

Message par benjarobin »

Je n'arrive absolument plus à te suivre... C'est normal que le test échoue et que ok ne soit pas affiché si $HOME/bin n'est pas présent dans le PATH. Ce qui est clairement le cas sur 2 de tes PC...
Bref, pour moi il n'y a aucun souci... Il faut vraiment que tu expliques en détail...

Pourquoi tu mélanges /usr/bin et $HOME/bin, ce n'est clairement pas la même chose
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange (résolu)

Message par karhu »

Dernière info lorsque j'utilise mon programme de test avec la commande if [ `echo ${PATH} | grep -c $HOME/bin` -eq 0 ]; il me répond bien que le répertoire n'est pas dans le PATH. Mais quand je source le .bash_profile avec cette commande incluse :

Code : Tout sélectionner

source .bash_profile 
bash: [: -eq : opérateur unaire attendu
Est ce normal ?
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange (résolu)

Message par benjarobin »

Je n'arrive absolument plus à te suivre...
Merci de re-exposer le problème calmement comme si c'était un autre sujet.
Donne des commandes complètes et simple que je peux tester aussi. Car tu me donne des bouts de script, puis des bouts de sortie...
Tu pars littéralement dans tous les sens, il est impossible de te suivre. De plus merci de donner le contenu des fichiers demandés plus haut
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange (résolu)

Message par karhu »

Explications :
Je sais que /usr/bin est dans le PATH et que $HOME/bin n'y est pas. Donc en ajoutant et en supprimant des # je peux facilement vérifier la présence et/ou l'absence d'un répertoire dans le PATH.
Pour ce qui est du résultat du test je suis d'accord avec toi, sauf que ce test est utilisé dans mon .bash_profile pour le rajouter dans le PATH s'il n'y est pas et qu'il ne le fait pas, sur une machine seulement.

Code : Tout sélectionner

#
# ~/.bash_profile
#
#
### Paramètres et variables d'environnement
#
if [ -d $HOME/bin ];
then
  if [ `echo ${PATH} | grep -q $HOME/bin` -eq 0 ];
  then
    PATH="$PATH:$HOME/bin";
    export PATH;
  fi
fi
#
### Paramètres et variables particulières
#
[[ -f ~/.bashrc ]] && . ~/.bashrc
#
### Connexion directe
#
[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startxfce4

Code : Tout sélectionner

#
# ~/.bashrc
#
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
#PS1='\u > '
#
### Alias et fonctions de confort
#
xmc () { su -c mc; }
xsu () { su -c "$*"; }
pong () { ping -c 5 "$*"; }
#
### Paramètres et variables d'environnement
#
export EDITOR=vim;

# pour midori
export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins";

# pour skype en cas de distorsion du son
#PULSE_LATENCY_MSEC=60;
export PULSE_LATENCY_MSEC=60

Code : Tout sélectionner

#
# /etc/bash.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

PS1='\u > '
PS2='> '
PS3='> '
PS4='+ '

case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
#    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
     PROMPT_COMMAND='echo -ne "\033]0;${PWD}\007"'                                                       
    ;;
  Terminal)
    PROMPT_COMMAND='echo -ne "\033]0;${PWD}\007"'                                                       
    ;;
  screen)
#    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    PROMPT_COMMAND='echo -ne "\033]0;${PWD}\007"'                                                       
    ;;
esac
#
### Alias g�n�raux
#
alias disk='df -HT'
alias ls='ls --color=auto'
alias ll='ls -lA --group-directories-first'
#
### Variables d'environnement
#
export PROMPT_COMMAND
export EDITOR='vim'
if [ -f /usr/bin/most ];
then
  export PAGER='most';
fi

[ -r /usr/share/bash-completion/bash_completion   ] && . /usr/share/bash-completion/bash_completion

Code : Tout sélectionner

# /etc/profile

#Set our umask
umask 022

# Set our default path
PATH=".:/usr/bin:/usr/local/sbin:/usr/local/bin"
if [ -d /opt/bin ];
then
  PATH="$PATH:/opt/bin";
fi
export PATH
export HISTSIZE=1000
export HISTCONTROL="ignoreboth"
export HISTIGNORE=""
export PKG_CONFIG_PATH="/usr/lib/pkgconfig"
export INPUTRC="/etc/inputrc"
export LESS="-R"

# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
	for profile in /etc/profile.d/*.sh; do
		test -r "$profile" && . "$profile"
	done
	unset profile
fi

# Source global bash config
if test "$PS1" && test "$BASH" && test -r /etc/bash.bashrc; then
	. /etc/bash.bashrc
fi

# Termcap is outdated, old, and crusty, kill it.
unset TERMCAP

# Man is much better than us at figuring this out
unset MANPATH
Dernière modification par karhu le lun. 09 mars 2015, 18:07, modifié 1 fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange (résolu)

Message par benjarobin »

Bon c'est déjà plus clair (bien qu'incomplet)... Sinon la commande (le if) que tu donnes est invalide...
Tu devrais utiliser à la place cette ligne

Code : Tout sélectionner

if ! echo ${PATH} | grep -q $HOME/bin;
Ou encore une autre solution

Code : Tout sélectionner

if ! grep -q $HOME/bin <<< "${PATH}" ;
Pour cette méthode (qui est bien plus lourde)

Code : Tout sélectionner

if [[ `echo ${PATH} | grep -q $HOME/bin` -eq 0 ]] ;
cela ne peut pas fonctionner car ici tu compare la sortie de la commande, et non le code de retour
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange (résolu)

Message par karhu »

OK, merci.
Pour mon prochain problème (python) je passerai par la phase brouillon avant d'envoyer, histoire de voir si je comprends en me relisant. :wink:
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
avi3000
Chu Ko Nu
Messages : 405
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [grep] Comportement étrange (résolu)

Message par avi3000 »

Bonsoir,

Ce qui est étrange et qui explique tous ces désagréments, c'est d'utiliser grep pour faire une recherche de sous-chaine dans un script en bash.
BASH permet ces recherches très facilement, sans utilisation de programme externe :

Code : Tout sélectionner

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

[ $PATH = "${PATH%%*/usr/bin*}" ] && echo 'pas dans le path' || echo 'trouve'
trouve;	#/usr/bin est dans le PATH

[ $PATH = "${PATH%%*/usr/boing*}" ] && echo 'pas dans le path' || echo 'trouve'
pas dans le path;	#/usr/boing n'est pas dans le PATH
Le man bash donne toutes les explications des tests ci-dessus.

BASH, c'est simple, BASH c'est beau.
Je suis sur devuan avec sysvinit et kbwm
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17617
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [grep] Comportement étrange (résolu)

Message par benjarobin »

En effet bien meilleur solution :D
avi3000 a écrit :BASH, c'est simple, BASH c'est beau.
Question de point de vue :( :copain:
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
avi3000
Chu Ko Nu
Messages : 405
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [grep] Comportement étrange (résolu)

Message par avi3000 »

Les commandes indiquées fonctionnent également dans zsh.

ZSH, c'est simple aussi, ZSH c'est encore plus beau.
Je suis sur devuan avec sysvinit et kbwm
Avatar de l’utilisateur
karhu
Maître du Kyudo
Messages : 1222
Inscription : lun. 27 sept. 2010, 14:32
Localisation : Ile de France

Re: [grep] Comportement étrange (résolu)

Message par karhu »

Je ne me sers que des commandes que je (crois) maîtrise(r).
Je n'utilise le bash, peut-être à tord, que pour des programmes nécessitant un enchaînement de commandes et des tests basiques. J'ai conscience de sa puissance, et même de sa beauté, mais pas de sa simplicité si on ne le pratique pas souvent. Je préfère rester simple dans ma programmation quitte à ne pas être très orthodoxe ni très joli.
Pour moi grep recherche une chaîne de caractères dans une ligne et prévient si elle est trouvée. Je lui donne donc une ligne à lire et je lui demande s'il trouve. En fonction de sa réponse je fais ou ne fais pas une action. De plus ce n'est même pas un programme c'est juste mon fichier .bash_profile.
Toutefois merci pour ta solution effectivement plus élégante. Mais m'en souviendrai je dans quelques mois ? :P
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
avi3000
Chu Ko Nu
Messages : 405
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [grep] Comportement étrange (résolu)

Message par avi3000 »

2 précisions :
ton .bash_profile est un programme bash à part entière.
grep ne recherche pas une chaîne de caractères dans une ligne, mais dans un fichier de une ou plusieurs lignes.

cadeau (à coller dans ton .bash_profile par exemple) :

Code : Tout sélectionner

#	${0##*/} = basename du script
#	${0%/*}  = dirname du script ou $0 si pas de chemin
#	${0##*.} = extension du script ou $0 si pas d'extension
ces 3 exemples permettent de retrouver ce qui est indiqué.
Ils permettent aussi d'en déduire d'autres, au coup par coup, comme celles qui répondaient à ton problème.
Je suis sur devuan avec sysvinit et kbwm
Répondre