Contenu | Rechercher | Menus

Annonce

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.

À propos de l'équipe du forum.

#1 Le 26/12/2012, à 19:44

omnimax

fonction dans zsh qui ne fonctionne pas ?

Bonsoir voici la fonction en question et je ne comprends pas pourquoi cela ne marche pas ?

rep()
{
PS3='Choisissez le fichier à ouvrir : ' # Affiche l'invite.

echo

select fichier in $(ls -d -b **/$1)
do
  
  nautilus **/$fichier
  echo
  break 
}

car dans le terminal si je vérifie ma variable

fichier=$(ls -d -b **/essai)
echo $fichier
Documents/essai

donc si après je note

nautilus **/$fichier 

cela doit marcher!

hors voila le résultat qu'il me met :

zsh: no matches found: **/^[[0m^[[01;34mDocuments/essai^[[0m

Dernière modification par greg2007 (Le 27/12/2012, à 11:36)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#2 Le 26/12/2012, à 20:06

pingouinux

Re : fonction dans zsh qui ne fonctionne pas ?

Salut,
Ton ls doit être un alias qui fait une sortie couleur, d'où les caractères bizarres. Mais il vaut mieux faire comme ceci :

select fichier in **/$1
……………

Hors ligne

#3 Le 26/12/2012, à 20:13

Postmortem

Re : fonction dans zsh qui ne fonctionne pas ?

Salut,
Je connais ps zsh mais bon, ta logique n'est pas bonne.
Tu fais :

fichier=$(ls -d -b **/essai)
echo $fichier
Documents/essai
nautilus **/$fichier

Donc après, plus besoin de spécifier **/ devant $fichier.
Sinon, si ça marche comme en bash pour ce qui est des développements de variables et les autres développements, tu devrait plutôt faire ainsi :

rep()
{
select fichier in **/"$1"
do
  nautilus "$fichier"
  echo
  break
done
}

ça évitera des soucis sur les noms de fichiers avec espaces.

Dernière modification par Postmortem (Le 26/12/2012, à 20:17)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 26/12/2012, à 20:48

omnimax

Re : fonction dans zsh qui ne fonctionne pas ?

yep merci pour les soluces,

j'ai donc compris qu'il est plus intéressant de faire **/"$1" que ls **/"$1"
car la première fonction donne par exemple Ubuntu \One alors que la seconde commande donne Ubuntu One, ce qui ne permet pas de réutiliser la variable tel quelle puisqu'il y a un espace.

Par contre ce que je ne comprends pas c'est que essai* directement introduit après la fonction ne fonctionne pas alors que la fonction ci-dessous marche sans aucun souci alors que c'est le même principe ?

rep()
{
PS3='Choisissez le fichier à ouvrir : ' # Affiche l'invite.

echo

select fichier in **/"$1"*
do
  
  nautilus **/"$fichier" 
  echo
  break  #  Qu'arriverait-il s'il n'y avait pas de 'break' ici ?
         #+ fin.
done
}

14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#5 Le 26/12/2012, à 20:54

Postmortem

Re : fonction dans zsh qui ne fonctionne pas ?

Il ne faut pas mettre :

nautilus **/"$fichier"

mais :

nautilus "$fichier"

Si tu ne mets pas break, si le résultat de **/"$1" renvoie plusieurs fichiers, ça ouvrira nautilus une fois par fichier.

Edit :
Et il ne faut pas passer essai* en paramètre de ta fonction mais seulement essai car l'etoile est déjà incluse dans la fonction.

Re-edit :
De plus, si tu passes essai* en paramètre de ta fonction et que, dans le repertoire où tu te trouves au moment de l'exécution, il y a un fichier essai.txt par exemple, l'appel :

rep essai*

sera remplacé par :

rep essai.txt

Dernière modification par Postmortem (Le 26/12/2012, à 21:03)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 26/12/2012, à 22:47

omnimax

Re : fonction dans zsh qui ne fonctionne pas ?

De plus, si tu passes essai* en paramètre de ta fonction et que, dans le repertoire où tu te trouves au moment de l'exécution, il y a un fichier essai.txt par exemple, l'appel :

rep essai*
sera remplacé par :

rep essai.txt

en fait en mettant rep essai* il me met zsh: no matches found: essai*

alors que la fonction ci-dessous marche parfaitement alors que c'est le même principe c'est cela que je ne pige pas.

rep()
{
PS3='Choisissez le fichier à ouvrir : ' # Affiche l'invite.

echo

select fichier in **/"$1"*
do
  
  nautilus **/"$fichier" 
  echo
  break  
done
}

14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#7 Le 26/12/2012, à 23:01

Postmortem

Re : fonction dans zsh qui ne fonctionne pas ?

Quand tu dis qu'elle marche, tu lui passes quel paramètre à la fonction pour qu'elle marche ??

Edit :
Et je te dis et te répète que dans ta fonction, il ne faut pas mettre :

nautilus **/"$fichier"

Mais mettre :

nautilus "$fichier"

Quand tu fais select fichier in **/"$1"*, la variable fichier aura comme contenu le nom du fichier avec son éventuel chemin, donc pas besoin de mettre **/"$fichier"

Dernière modification par Postmortem (Le 26/12/2012, à 23:09)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 26/12/2012, à 23:15

omnimax

Re : fonction dans zsh qui ne fonctionne pas ?

rep essai

me donnera par exemple essai.txt et essai ou essai.mp3

mais je crois avoir trouvé... en fait je pense que zsh ou batch (c'est pareil)' interprète essai* (lorsque rep () ..."$1" ) comme essai avec astérisque sans penser à * qui remplace chaque caractère d'où l'erreur puisqu'il pense trouver littéralement essai*.

donc la bonne syntaxe c'est mettre "$1"* dans la fonction rep ()


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#9 Le 27/12/2012, à 05:13

omnimax

Re : fonction dans zsh qui ne fonctionne pas ?

libre()
{PS3='Choisissez le fichier libreoffiice à ouvrir : '
echo
select fichier in **/"$1"*. (xls|ods|doc)
do
  libreoffice **/"$fichier"
  echo
  break
done
}

ici je cale. j'aimerai n'afficher que les extensions xls ods et doc mais ma syntaxe est mauvaise.
j'ai déjà tenté pas mal de chose...et notamment ceci cité dans un livre sur le bash

nomdefichier@(xls|doc|ods)

pour afficher un nom de fichier avec en fin soit xls ou doc ou ods mais cela ne marche pas.

**/"$fichier".xls |  **/"$fichier".doc

  > ne marche pas alors que | veut bien dire ou

select fichier in **/"$1"*.xls **/"$1"*.doc 

> non plus

ça m'énerve un peu car je pense avoir trouvé en appliquant des syntaxes que je trouve logiques mais ce n'est pas le cas, ce n'est pas évident sad

Dernière modification par greg2007 (Le 27/12/2012, à 05:15)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#10 Le 27/12/2012, à 05:20

omnimax

Re : fonction dans zsh qui ne fonctionne pas ?

trouvé !

libre()
{PS3='Choisissez le fichier libreoffice à ouvrir : '
echo
select fichier in **/"$1"*(ods|xls|doc)
do
  libreoffice **/"$fichier"
  echo
  break
done
}

Mais j'aimerai que cela fonctionne aussi bien pour une entrée en minsucule et majuscule
facture > donnerait facture.xls et ou FACTURE.xls et ou Facture.xls ... vous pigez?

Dernière modification par greg2007 (Le 27/12/2012, à 05:24)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#11 Le 27/12/2012, à 07:31

Postmortem

Re : fonction dans zsh qui ne fonctionne pas ?

Salut,
Voilà ce que donnerait ta fonction en BASH (je ne connais pas zsh) :

libre()
{
   # Ceci permet d'activer les syntaxes du genre @(ods|xls|doc) :
   shopt -s extglob
   # Permet d'activer la reconnaissance de **, sinon, **/ n'est pas récursif :
   shopt -s globstar
   # Pour ne pas tenir compte de la casse :
   shopt -s nocaseglob
   # Tous ces shopt -s ... ne sont peut-être pas nécessaire en zsh

   PS3='Choisissez le fichier libreoffice à ouvrir : '
   echo
   select fichier in **/"$1"*@(ods|xls|doc)
   do
      libreoffice "$fichier"
      echo
      break
   done
}

Et je te re-re-re-re-dis qu'à l'intérieur de ta boucle, remplacer libreoffice **/"$fichier" par libreoffice "$fichier".
Lorsque tu fais select fichier in **/"$1"*@(ods|xls|doc), la variable fichier contient le nom du fichier ainsi que son chemin, donc ça ne sert à rien de remettre **/ devant "$fichier"

Edit :
En bash, comme tu peux le voir, il faut mettre @(ods|xls|doc), à la place de (ods|xls|doc). De plus, cette syntaxe n'est pas reconnue par défaut, il faut donc faire le shopt -s extglob avant.
En zsh, je ne sais pas si ces "commandes" shopt existent.

Dernière modification par Postmortem (Le 27/12/2012, à 07:35)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#12 Le 27/12/2012, à 09:36

omnimax

Re : fonction dans zsh qui ne fonctionne pas ?

merci Postmortem,

Pour le libreoffice **/$1 , désolé j'ai fait trop de copier coller smile c'est corrigé dans mon .zshrc.

Pour l'option nocaseglob c'est setopt nocaseglob dans zsh et cela fonctionne à merveille ! Grand merci à toi donc

Bonne journée.


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne