Page 1 sur 2
[grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 15:13
par karhu
Bonjour
Sur mes quatre PC (deux portables et deux tours) trois réagissent bien à la commande
grep
:
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 :
Normal dans $PATH et $_. Ou alors c'est moi ?

Re: [grep] Comportement étrange
Publié : lun. 09 mars 2015, 15:36
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
Re: [grep] Comportement étrange
Publié : lun. 09 mars 2015, 15:49
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
:
Re: [grep] Comportement étrange
Publié : lun. 09 mars 2015, 15:54
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.
Re: [grep] Comportement étrange
Publié : lun. 09 mars 2015, 16:12
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.
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 16:31
par benjarobin
Peux tu donner le contenu de $PATH de l'ensemble de tes machines ? Je serais curieux d'avoir la sortie de
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...
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 17:04
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 :
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 17:10
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
ne donne pas toujours juste
ok
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 17:25
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 ?).
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 17:40
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
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 17:43
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 :
Est ce normal ?
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 17:55
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
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 18:00
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
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 18:05
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
Ou encore une autre solution
Pour cette méthode (qui est bien plus lourde)
cela ne peut pas fonctionner car ici tu compare la sortie de la commande, et non le code de retour
Re: [grep] Comportement étrange (résolu)
Publié : lun. 09 mars 2015, 18:14
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.

Re: [grep] Comportement étrange (résolu)
Publié : mar. 10 mars 2015, 20:55
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.
Re: [grep] Comportement étrange (résolu)
Publié : mar. 10 mars 2015, 20:57
par benjarobin
En effet bien meilleur solution
avi3000 a écrit :BASH, c'est simple, BASH c'est beau.
Question de point de vue

Re: [grep] Comportement étrange (résolu)
Publié : mar. 10 mars 2015, 21:06
par avi3000
Les commandes indiquées fonctionnent également dans zsh.
ZSH, c'est simple aussi, ZSH c'est encore plus beau.
Re: [grep] Comportement étrange (résolu)
Publié : mar. 10 mars 2015, 21:21
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 ?

Re: [grep] Comportement étrange (résolu)
Publié : mar. 10 mars 2015, 22:00
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.