Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

nombre réponses : 25

#0 Re : -1 »  En écoute en ce moment (2) » Le 26/05/2016, à 07:31

Postmortem
Réponses : 3 855

Bonjour !
Commençons la journée avec un gros riff dans la gueule !
Pantera - Shedding Skin

#1 Re : -1 »  [RESOLU] find+exec+sh+grep : retour de grep invariable » Le 31/05/2017, à 11:06

Postmortem
Réponses : 15

Salut,
Je pense qu'il suffit de rajouter un « \ » sur la dernière ligne :
echo \$?" \;

Edit:
Ah non, ça suffit pas, "sh" ne semble pas savoir traduire $'\r', il faudrait :

find . -name "texte.txt" -exec bash -c "grep -q $'\r' \$0; echo \$?" '{}' \;

Ou pour repartir sur ce que tu as fait :

find . -name "texte.txt"    -exec bash -c "mv {} _tmpfile;
                grep -q $'\r' _tmpfile;
                echo \$?" \;

#2 Re : -1 »  [RESOLU] find+exec+sh+grep : retour de grep invariable » Le 31/05/2017, à 11:23

Postmortem
Réponses : 15
find . -name "texte.txt"    -exec sh -c "mv {} _tmpfile;
                grep -q '^M' _tmpfile;
                echo \$?" \;

Le « ^M » se tape en faisant « Ctrl-v » puis « Ctrl-m ».

#3 Re : -1 »  [RESOLU] find+exec+sh+grep : retour de grep invariable » Le 31/05/2017, à 15:38

Postmortem
Réponses : 15
Tangram a écrit :

"grep -q `echo \\\r` _tmpfile;" est plus compatible, non ? En tout cas, il fonctionne aussi.

Perso, j'utiliserais la syntaxe « $(commande) » plutôt que « `commande` ».

Pour le « echo » en lui-même, je ne sais pas... Est ce que tous les « sh » embarquent une version interne de « echo » qui acceptent les options « -e » et « -E » ? Et s'il n'y a pas de version interne de « echo », est ce que le binaire accepte toujours les options « -e » et « -E » ?
Et dans tous les cas, est-ce le comportement « -e » ou « -E » qui est par défaut ?

Bref, perso je fais pas de « sh » car selon la distribution linux ou le système Unix, il y a des différences.
Il y a des distribs Linux où « sh » est un lien vers « dash » ; d'autres, c'est un lien vers « bash ».
Sur les systèmes Unix, selon le système, il y a des différences.

Au moins « bash », quand il est installé, c'est le même (à la version prêt bien sûr).

#4 Re : -1 »  [RESOLU] find+exec+sh+grep : retour de grep invariable » Le 02/06/2017, à 07:56

Postmortem
Réponses : 15

Salut,
J'ai pas essayé mais je me demandais si simplement ceci fonctionnait :

find . -name "texte.txt" -exec sh -c 'mv {} _tmpfile; grep -q "\\r" _tmpfile; echo $?' \;

Edit :
Ah non, la commande ci-dessus ne fonctionne pas !

#5 Re : -1 »  [RESOLU] find+exec+sh+grep : retour de grep invariable » Le 02/06/2017, à 12:10

Postmortem
Réponses : 15

Le souci, c'est que si je me souviens bien, il y avait certains sh qui transformaient « "\r" » en « r » avant l'exécution de la commande ; « printf "\r" » afficherait donc « r ».
J'ai testé avec dash (sh est un lien vers dash sur mon PC) et bash (sur un serveur, sh est un lien vers bash mais ça exécute bash « en version sh ») et « "\r" » est bien transformé en « \r » avant exécution, donc c'est bon.

Mais pour être certain, le mieux serait de mettre « printf '\r' » (des simples quotes au lieu des doubles), tu seras ainsi certain que ça restera « \r ».

#6 Re : -1 »  [RESOLU] find+exec+sh+grep : retour de grep invariable » Le 02/06/2017, à 17:16

Postmortem
Réponses : 15

En fait, pour qu'il n'y ait aucune interprétation avant l'exécution, il faudrait faire :

find . -name "texte.txt" -exec sh -c 'mv {} _tmpfile; grep -q $(printf '\'\\r\'') _tmpfile; printf '\''%d\n'\'' $?' \;

#7 -1 »  [bash] Redirections sorties standard et d'erreur vers fichiers/écran » Le 30/05/2017, à 18:51

Postmortem
Réponses : 4

Salut,

Voilà bien longtemps que je ne suis pas venu faire un tour par ici !!
En général, je venais plutôt pour essayer de filer un coup de main mais là, je m'arrache les cheveux depuis un moment sur un problème.

Mon but est de rediriger les sorties standard et d'erreur d'un script vers un fichier log ET vers l'écran...
Ça c'est pas compliqué...
Mais je voudrais en plus que le script garde 2 sorties distinctes et que ça soit synchro. Et c'est avoir ces 2 conditions en même temps qui ne fonctionne pas !

Petit exemple :

$ cat test.sh 
#!/bin/bash

# Redirections et sauvegardes sorties originales
exec 3>&1 4>&2 > >(tee /tmp/test/mon_log) 2>&1

echo "Message 1 sur sortie STANDARD"
echo "Message 1 sur sortie ERREUR" >&2

echo "Message 2 sur sortie STANDARD"
echo "Message 2 sur sortie ERREUR" >&2

# Restauration sorties originales
exec >&3- 2>&4-

Ce qui donne à l'exécution :

$ ./test.sh 
$ Message 1 sur sortie STANDARD
Message 1 sur sortie ERREUR
Message 2 sur sortie STANDARD
Message 2 sur sortie ERREUR

$ cat mon_log
Message 1 sur sortie STANDARD
Message 1 sur sortie ERREUR
Message 2 sur sortie STANDARD
Message 2 sur sortie ERREUR
$ 

Ça a l'air bien, n'est ce pas ?? Si ce n'est le prompt qui se raffiche avant l'affichage de tous mes messages... Mais :

$ ./test.sh >fic_sortie 2>fic_erreur
$ ls -ltr
total 12
-rwxrwxr-x 1 XXX XXX 314 mai   30 18:13 test.sh
-rw-rw-r-- 1 XXX XXX   0 mai   30 18:20 fic_erreur    # <=== C'est vide !!
-rw-rw-r-- 1 XXX XXX 116 mai   30 18:20 mon_log
-rw-rw-r-- 1 XXX XXX 116 mai   30 18:20 fic_sortie
$

Rien ne va dans fic_erreur, la sortie standard et la sortie d'erreur sont "fusionnées", tout est donc allé dans fic_sortie.

Alors après des dizaines d'essais, je suis arrivé à ça ; j'ai bien mes 2 sorties séparées mais j'ai des problèmes dans l'ordre d'affichage des messages dans "mon_log" ou si je laisse l'affichage à l'écran :

$ cat test2.sh 
#!/bin/bash

fic_log=/tmp/test/mon_log
>"$fic_log" # On vide le log

exec 3>&1 4>&2

coproc gestion_sorties {
    while read -r
    do
        case $REPLY in
            1\;*) fd=3;;
            2\;*) fd=4;;
        esac
        printf '%s\n' "${REPLY#?;}" >> "$fic_log"
        printf '%s\n' "${REPLY#?;}" >&$fd
    done
}

exec > >( while read -r; do echo "1;$REPLY"; done >&${gestion_sorties[1]} ) 2> >( while read -r; do echo "2;$REPLY"; done >&${gestion_sorties[1]} )

echo "Message 1 sur sortie STANDARD"
echo "Message 1 sur sortie ERREUR" >&2

echo "Message 2 sur sortie STANDARD"
echo "Message 2 sur sortie ERREUR" >&2

exec >&3- 2>&4- {gestion_sorties[1]}>&- {gestion_sorties[0]}<&-
wait $gestion_sorties_PID
$ 
$ ./test2.sh >fic_sortie 2>fic_erreur
$ ls -ltr
total 20
-rwxrwxr-x 1 XXX XXX 314 mai   30 18:13 test.sh
-rwxrwxr-x 1 XXX XXX 718 mai   30 18:34 test2.sh
-rw-rw-r-- 1 XXX XXX 116 mai   30 18:37 mon_log
-rw-rw-r-- 1 XXX XXX  60 mai   30 18:37 fic_sortie
-rw-rw-r-- 1 XXX XXX  56 mai   30 18:37 fic_erreur
$ more mon_log fic_sortie fic_erreur
::::::::::::::
mon_log
::::::::::::::
Message 1 sur sortie STANDARD
Message 2 sur sortie STANDARD   # <=== Les messages dans mon_log ne sont pas dans le bon ordre   
Message 1 sur sortie ERREUR
Message 2 sur sortie ERREUR
::::::::::::::
fic_sortie
::::::::::::::
Message 1 sur sortie STANDARD
Message 2 sur sortie STANDARD
::::::::::::::
fic_erreur
::::::::::::::
Message 1 sur sortie ERREUR
Message 2 sur sortie ERREUR
$ 

Bon, en vrai, c'est pas dramatique, c'est plus du chipotage que je fais.... Mais ça m'énerve !!!

Merci d'avance pour votre aide !

Édit :
Mon test2.sh est tordu, on peut arriver au même résultat bien plus simplement, mais toujours avec le problème de synchro :

#!/bin/bash
exec 3>&1 4>&2 > >(tee -a mon_log) 2> >(tee -a mon_log >&2)

echo "Message 1 sur sortie STANDARD"
echo "Message 1 sur sortie ERREUR" >&2

echo "Message 2 sur sortie STANDARD"
echo "Message 2 sur sortie ERREUR" >&2

exec >&3- 2>&4-

#8 Re : -1 »  [bash] Redirections sorties standard et d'erreur vers fichiers/écran » Le 31/05/2017, à 09:28

Postmortem
Réponses : 4

Salut pingouinux,
Je savais que ça te plairait comme souci ! tongue

pingouinux a écrit :

Ça me paraît logique, puisque tu rediriges stderr sur stdout dans test.sh

exec 3>&1 4>&2 > >(tee /tmp/test/mon_log) 2>&1

Oui oui, c'est logique, c'était car je m'attendais à ce qu'on me propose cette solution, donc j'ai pris les devants pour expliquer pourquoi ce n'est pas ce que j'attendais.

J'ai mis à jour mon 1er message avec une solution bien plus simple (j'en suis arrivé à "coproc" après des dizaines d'essais, me suis perdu !) pour garder 2 flux en sortie mais j'ai toujours le souci de synchro.

Je crois qu'on ne peut pas y arriver en bash d'après tout ce que j'ai lu hier soir.

#9 Re : -1 »  [bash] Redirections sorties standard et d'erreur vers fichiers/écran » Le 31/05/2017, à 10:58

Postmortem
Réponses : 4

Merci, ça fonctionne nickel si on a que des « echo » dans le script.
Mais bien sûr, je n'ai pas que ça dedans ; il fait beaucoup de chose ce script, dont un appels ssh pour exécuter un script sur un serveur.
J'ai fait un test avec un simple awk qui écrit sur STDOUT et STDERR et là, ça ne fonctionne plus :

$ cat test.sh 
#!/bin/bash

exec 3>&1 4>&2 > >(tee -a mon_log >&1) 2> >(tee -a mon_log >&2)

stdbuf -o0 -e0 awk 'BEGIN { for (i=1; i<=5; i++) { printf "Message %d sur sortie STANDARD\n", i; printf "Message %d sur sortie ERREUR\n", i > "/dev/stderr" } }'

exec >&3- 2>&4-
$ 

$ ./test.sh 
Message 1 sur sortie STANDARD
Message 2 sur sortie STANDARD
Message 1 sur sortie ERREUR
Message 2 sur sortie ERREUR
Message 3 sur sortie ERREUR
Message 4 sur sortie ERREUR
Message 5 sur sortie ERREUR
Message 3 sur sortie STANDARD
Message 4 sur sortie STANDARD
Message 5 sur sortie STANDARD
$ 

Mais je garde dans un coin ce « stdbuf », merci !

Edit :
Je pense que c'est mort à partir du moment où la sortie standard et la sortie d'erreur font appel à 2 « substitutions de processus » étant donné que la « substitution de processus » est asynchrone.

#10 Re : -1 »  [Résolu] Equivalent du ls pour un pour fichier .tar.gz et fichier .tar » Le 11/05/2016, à 18:32

Postmortem
Réponses : 8

Salut,
Pour avoir simplement le contenu de l'archive :

tar tf mon_archive.tar.gz

Pour avoir plus de détails, un peu comme « ls -l » :

tar tvf mon_archive.tar.gz

#11 Re : -1 »  [Résolu] Equivalent du ls pour un pour fichier .tar.gz et fichier .tar » Le 13/05/2016, à 14:13

Postmortem
Réponses : 8

Salut,
Elle vient d'où ton archive ?
À première vue, je dirais qu'elle est corrompue.
Après, le mieux, ça serait de copier-coller ici la commande que tu tapes et ce que ça renvoie.

#12 Re : -1 »  Find et exclude list » Le 20/07/2016, à 00:35

Postmortem
Réponses : 6

Salut,

Pour ne lire qu'une fois le fichier contenant les exclusions, on peut utiliser awk.
Le fichier des exclusions doit contenir sur chaque ligne le nom d'un fichier image exact avec son chemin.

Pour l'exemple, j'ai créé cette arbo :

$ ls -RF1 /tmp/test/Images
/tmp/test/Images:
rep 1/
rep 2/
rep 3/
rep 4/

/tmp/test/Images/rep 1:
sous rep/

/tmp/test/Images/rep 1/sous rep:
un fichier1.jpg
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

/tmp/test/Images/rep 2:
sous rep/

/tmp/test/Images/rep 2/sous rep:
un fichier1.PNG
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

/tmp/test/Images/rep 3:
sous rep/

/tmp/test/Images/rep 3/sous rep:
un fichier1.jpg
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

/tmp/test/Images/rep 4:
sous rep/

/tmp/test/Images/rep 4/sous rep:
un fichier1.jpg
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

Le fichier contenant la liste des exclusions :

$ cat /tmp/test/liste_exclusions.txt
/tmp/test/Images/rep 1/sous rep/un fichier1.jpg
/tmp/test/Images/rep 2/sous rep/un fichier2.jpg
/tmp/test/Images/rep 3/sous rep/un fichier  3.jpg

Et on fait comme ça :

rep_images=/tmp/test/Images
liste_exclusions=/tmp/test/liste_exclusions.txt
while read -r image
do
   echo "Traitement de $image"
done < <(awk 'NR==FNR {i[$0]=1; next} !i[$0]' "$liste_exclusions" <(find "$rep_images" \( -iname '*.jpg' -o -iname '*.png' \) -type f))

Ce qui donne :

Traitement de /tmp/test/Images/rep 2/sous rep/un fichier  3.jpg
Traitement de /tmp/test/Images/rep 2/sous rep/un fichier1.PNG
Traitement de /tmp/test/Images/rep 1/sous rep/un fichier  3.jpg
Traitement de /tmp/test/Images/rep 1/sous rep/un fichier2.jpg
Traitement de /tmp/test/Images/rep 3/sous rep/un fichier1.jpg
Traitement de /tmp/test/Images/rep 3/sous rep/un fichier2.jpg
Traitement de /tmp/test/Images/rep 4/sous rep/un fichier  3.jpg
Traitement de /tmp/test/Images/rep 4/sous rep/un fichier1.jpg
Traitement de /tmp/test/Images/rep 4/sous rep/un fichier2.jpg

#13 Re : -1 »  Find et exclude list » Le 21/07/2016, à 09:07

Postmortem
Réponses : 6

Salut MicP,
C'est pas couillon ça !

#14 Re : -1 »  Mount point does not exist (Résolu) » Le 17/07/2016, à 23:20

Postmortem
Réponses : 14

Salut,
Pour essayer, mets plutôt le point de montage ailleurs que dans /media. C'est dans ce dernier que se montent les clés usb automatiquement il me semble, il est donc peut-être géré d'une façon particulière par le système.
Essaie de mettre /mnt/data par exemple.

#15 Re : -1 »  Mount point does not exist (Résolu) » Le 17/07/2016, à 23:55

Postmortem
Réponses : 14
jplemoine a écrit :

Je pense qu'il ne faut pas mettre data mais le chemin complet (/media/data dans ton cas ) dans le fsatb.

En relisant son post, je me dis que t'as bien fait de le préciser !

Édit :

Coeur Noir a écrit :

À savoir : ce qui est monté dans /media apparaît sous périphériques dans Nautilus.

Ah oui, c'est bon à savoir, merci !

#16 Re : -1 »  [RESOLUT] find et souci d'espace dans les nom de dossier » Le 19/07/2016, à 09:57

Postmortem
Réponses : 8

Salut,

gotcha5832 a écrit :

A votre avis le quel est plus performant entre

find ./ -type f \( -iname \*.jpg -o -iname \*.gif -o -iname \*.png -o -iname \*.jpeg \)

et

find -type f -iregex '.*\.\(jpg\|gif\|png\|jpeg\)

Je dirais déjà que ce qui est le plus performant serait de mettre "-type f" après "-iregex '.*\.\(jpg\|gif\|png\|jpeg\)" ou "\( -iname \*.jpg -o -iname \*.gif -o -iname \*.png -o -iname \*.jpeg \)"

En effet, le test sur le nom de fichier écarterait plus de fichiers/répertoires et donc, le "-type f" serait exécuté moins souvent.

#17 Re : -1 »  [résolu] permutation de données avec sed » Le 10/05/2016, à 17:13

Postmortem
Réponses : 11

Salut,

ldapsearch -z 0 -xLLL -b "ou=test3,dc=test2,dc=test1" givenname sn uid | awk -F: '/(sn|givenname|uid):/ { infos[$1]=$2 }
      infos["sn"] && infos["givenname"] && infos["uid"] { printf "givenname:%s,sn:%s,uid:%s,\n", infos["givenname"], infos["sn"], infos["uid"]; split("", infos)}'

Edit : ajout d'une virgule à la fin des lignes affichées.

#18 Re : -1 »  [Résolu] Terminal comportement étrange » Le 10/05/2016, à 16:58

Postmortem
Réponses : 17

Salut,
J'ai le même souci des fois.
En fait, c'est parce que lorsque tu appuies sur espace après ton « pipe », tu es encore appuyé sur « Alt Gr ».
En faisant « Alt Gr + espace » :

$ echo toto | grep toto
La commande «  grep » est introuvable, mais il y en a 16 similaires
 grep : commande introuvable

En faisant bien attention de ne plus appuyer sur « Alt Gr » quand je fais « espace » :

$ echo toto | grep toto
toto

Ça m'a saoulé plusieurs fois !!!

#19 Re : -1 »  [Résolu] Terminal comportement étrange » Le 10/05/2016, à 17:22

Postmortem
Réponses : 17
Cabochard a écrit :

Merci @Postmortem tu as enfin trouvé le problème !

Mais ce que je trouve bizarre, c'est que je n'ai jamais changé mes habitudes de "frappe" au clavier. C'est depuis que j'ai réinstallé mon PC que j'ai remarqué ce problème, donc il y a bien quelque chose qui "cloche"

Peut-être un nouveau raccourci clavier qui a été ajouté.
Ou tu tapes de plus en plus vite avec l’expérience !

#20 Re : -1 »  [Résolu] Terminal comportement étrange » Le 10/05/2016, à 17:47

Postmortem
Réponses : 17

C'est peut-être à cause des réglages dans « Paramètres système... » ==> « Saisie de texte » ==> « Paramètres du clavier... » ==> Onglet « Saisie »
Peut-être modifier le « Délai » ou la « Vitesse » dans « Touches de répétition »

#21 Re : -1 »  Perte du mode administrateur [RÉSOLU] » Le 10/05/2016, à 18:45

Postmortem
Réponses : 13

Salut,

Enrique-U a écrit :

J'ai récemment mis mon nom d'utilisateur dans le group de Virtualbox users car j'ai installé Virtualbox.

Comment as tu fait ?
Je sens bien que tu as fait une erreur dans la commande pour te mettre dans le groupe « Virtualbox users ».
Si c'est bien ça, va falloir que tu trouves un moyen pour « passer en root » afin de te remettre dans les bons groupes.

#22 Re : -1 »  Perte du mode administrateur [RÉSOLU] » Le 10/05/2016, à 20:13

Postmortem
Réponses : 13

Extrait d'un "man usermod" trouvé sur le net (j'ai pas Ubuntu sous la main là) :

-G groupe,[...]
    Une liste de groupes supplémentaires auxquels fait également partie l'utilisateur. Chaque groupe est séparé du suivant par une virgule, sans espace entre les deux. Les groupes sont soumis aux mêmes restrictions que celles données avec l'option -g. Si l'utilisateur fait actuellement partie d'un groupe qui n'est pas listé, l'utilisateur sera supprimé du groupe.

Voilà donc l'explication.
Faut toujours vérifier et se renseigner un minimum avant de taper des commandes qui commencent par sudo.
Pour réparer ça, je regarderai plus tard, quand j'aurai accès à Ubuntu. Il y aura peut-être une âme charitable pour t'aider d'ici là.
Tu es sous quelle version ?

Édit :
C'est peut-être pas ça, l'option "-a" était sensée éviter ce problème justement.
Quel est le résultat de :

id

#23 Re : -1 »  Conserver les antislashs » Le 08/05/2016, à 12:47

Postmortem
Réponses : 15

Je maitiens que ça ne fonctionne pas !
Tu n'as fait qu'un echo. La commande que tu as commenté à la fin de ton script verra des guillemets qui n'ont pas de signification particulière.
Mon exemple le prouve.
Les guillemets ne sont interprétés par le shell que s'ils sont mis explicitements. Ils n'ont pas de signification particulière s'ils sont le résultat d'un développement de variable.

Édit:
Et justement,dans mon exemple, les guillemets sont retirés juste avant l'exécution, mais après qu'ils aient fait leur rôle de protection de l'espace !
Une variable n'est soumise au découpage avec les caractères de l'IFS que si cette variable n'est pas entre guillemets.
Ton $suite lui, est découpé ici :

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${fichSortie}"${suite}

Re édit :
J'ai modifié mon précédent post par erreur, il contenait ça :

$ cat test.sh
arg1=$1
shift
for i in "$@"
do
   suite="$suite \"$i\""
done
ls -1 "$arg1"$suite

$ ls -1
entree 1.pdf
entree 2.pdf
entree 3.pdf
sortie.pdf
test.sh

$ ./test.sh sortie.pdf entree*
ls: "entree: No such file or directory
ls: 1.pdf": No such file or directory
ls: "entree: No such file or directory
ls: 2.pdf": No such file or directory
ls: "entree: No such file or directory
ls: 3.pdf": No such file or directory
sortie.pdf

$ cat test.sh
arg1=$1
shift
ls -1 "$arg1" "$@"

$ ./test.sh sortie.pdf entree*
entree 1.pdf
entree 2.pdf
entree 3.pdf
sortie.pdf

#24 Re : -1 »  Conserver les antislashs » Le 08/05/2016, à 13:53

Postmortem
Réponses : 15
MicP a écrit :

La solution que j'ai trouvé est donc beaucoup plus simple et c'est d'ailleurs pour ça que pingouinux ne disait rien big_smile : C'est la sienne en fait.

pingouinux a toujours raison... Enfin très souvent en tous cas !