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 30/01/2017, à 16:06

soshy

[Résolu] Etendre cd ...

Bonjour,

Je sais que certaines personnes ici sont bien plus cales que moi question shell, me voici donc querir votre aide...

Ce que je veux est assez simple. Admettons que j'ai une variable

PROJETS=/home/moi/Documents/projets

je veux que lorsque je fais

cd proj

Si il existe un repertoire "proj" dans le repertoire courant, y acceder (comportement normal)
Sinon, si l'argument est "proj", alors se rendre dans $PROJETS
Sinon, comportement normal.

J'ai bien tente un truc dans ce genre dans mon bashrc, mais meme sans verifier l'existence du repertoire "proj", ca fonctionne pas vraiment en fait...

cd() {
  case "$1" in
    proj) 
      cd "$PROJETS";;
       *)             
      cd "$1";;
  esac
}

Derniere chose, en l'occurence je suis sur OSX, mais ca reste en general assez proche de linux.

Dernière modification par soshy (Le 30/01/2017, à 18:48)

Hors ligne

#2 Le 30/01/2017, à 18:02

Watael

Re : [Résolu] Etendre cd ...

salut,

si une fonction porte le même nom qu'une commande qu'elle appelle, il faut faire précéder cette dernière soit de la  commande command, soit donner son chemin absolu.
sinon c'est la fonction qui sera appelée, et ça peut créer une boucle. hmm

pour ta question, en bash :

$ shopt cdable_vars
cdable_vars    	off
$ shopt -s cdable_vars
$ proj=~/Téléchargements/
$ cd proj
/home/watael/Téléchargements/
$ pwd
/home/watael/Téléchargements
$ 

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 30/01/2017, à 18:05

pingouinux

Re : [Résolu] Etendre cd ...

Bonjour,
Essaye ceci (je ne l'ai pas testé) :

cd "$rep" || { [ "$rep" = proj ] && cd "$PROJETS"; }

Hors ligne

#4 Le 30/01/2017, à 18:30

erresse

Re : [Résolu] Etendre cd ...

Hello,
La proposition de pingouinux fonctionne bien, on peut lui adjoindre "cd "$rep" 2>/dev/null || ..." pour supprimer le message d'erreur lorsque le répertoire dans "$rep" n'est pas trouvé...
smile


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#5 Le 30/01/2017, à 18:46

soshy

Re : [Résolu] Etendre cd ...

Watael, ce hero big_smile
Dans mon cas j'utilise zsh donc c'est un peu different, mais activer l'option cdable_vars c'est vraiment pas mal. J'ai juste un peu peur que des fois ca remplace sans que je me rende compte et j'aurai prefere avoir la main sur la liste des variables remplacable. Si on ne me propose rien de mieux je vais rester la dessus smile

pingouinux, si je comprend bien ta solution, c'est a mettre presque texto dans un script. Mon but n'est pas d'ecrire un script avec un cd conditionnel, mais bien de l'utiliser "manuellement" dans mon terminal pour me rendre simplement dans des repertoires dont le chemin est loin d'etre simple a memoriser...

Dernière modification par soshy (Le 30/01/2017, à 19:05)

Hors ligne

#6 Le 31/01/2017, à 17:31

pingouinux

Re : [Résolu] Etendre cd ...

@soshy : Tu peux utiliser une fonction

mon_cd() {
   cd "$1" 2>/dev/null || {
      case "$1" in
         proj1) cd "$PROJETS1";;
         proj2) cd "$PROJETS2";;
      esac
   }
}

Hors ligne

#7 Le 01/02/2017, à 01:21

soshy

Re : [Résolu] Etendre cd ...

J'ai envie d'aimer ta solution pingouinux (surement parce que c'est typiquement le genre de chose que j'avais dans l'idée au départ), mais il y a toujours un détail qui me chiffone :x

Je veux garder cd. Du coup, j'ai adapté en rajoutant command histoire que le truc ne se mélange pas les pinceaux comme l'a indiqué Watael. Après, j'ai constaté qu'utiliser simplement cd sans arguments ne fonctionnait pas. Donc j'ai rajouté un test sur le nombre de paramètres.
Tout ça pour se rendre compte que si je fais

cd rep_inexistant

Et ben aucun message d'erreur ne s'affiche, et oui, on a redirrigé ça vers /dev/null.

export X=$HOME/Téléchargements
export Y=/tmp
cd() {
   if [ "$#" -eq 0 ] ; then
      command cd
   else
      command cd "$1" 2>/dev/null || {
         case "$1" in
	    x) command cd "$X";;
            y) command cd "$Y";;
#	    *) ???
         esac
      }
   fi 
}

Il faudrait pouvoir stocker l'output stderr de command cd "$1" pour l'afficher dans le cas par défaut. J'imagine que c'est possible, après je sais pas faire et j'ai pas encore trop cherché non plus tongue

Dernière modification par soshy (Le 01/02/2017, à 01:39)

Hors ligne

#8 Le 01/02/2017, à 08:22

pingouinux

Re : [Résolu] Etendre cd ...

Ceci te convient-il ?

X=$HOME/Téléchargements
Y=/tmp 
fic_err=/tmp/err
cd() {
   >"$fic_err"
   if [ "$#" -eq 0 ] ; then
      command cd
   else
      command cd "$1" 2>"$fic_err" || {
         case "$1" in
            x) command cd "$X" 2>"$fic_err";;
            y) command cd "$Y" 2>"$fic_err";;
#           *) ???
         esac
      }
   fi 
   [ -s "$fic_err" ] && cat "$fic_err" 1>&2
}

Édité : Petite correction

Dernière modification par pingouinux (Le 01/02/2017, à 08:44)

Hors ligne

#9 Le 01/02/2017, à 12:58

soshy

Re : [Résolu] Etendre cd ...

C'est parfait ! Enfin... Avec bash uniquement neutral

Avec zsh je change juste pas de repertoire pour une raison que j'ai pas encore trouve...

Hors ligne

#10 Le 01/02/2017, à 13:37

pingouinux

Re : [Résolu] Etendre cd ...

soshy a écrit :

Avec zsh je change juste pas de repertoire pour une raison que j'ai pas encore trouve.

Montre ce que tu as fait. Il y a des chances que ta fonction s'exécute dans un sous-shell.

Hors ligne

#11 Le 01/02/2017, à 14:35

soshy

Re : [Résolu] Etendre cd ...

Bon, ce coup ci il bloque carrement sur sans me rendre la main.

J'ai juste copier coller ton bloc dans un fichier .fonctions
et dans .bashrc et .zshrc j'ai une ligne

source .fonctions

rien d'extraordinaire.

avec bash c'est bon, avec zsh reste bloque.

~ echo $0
-zsh
~ bash
bash-3.2$ echo $0
bash
bash-3.2$ cd y
bash-3.2$ pwd
/tmp
bash-3.2$ cd
bash-3.2$ pwd
/Users/moi
bash-3.2$ cd /tmp
bash-3.2$ pwd
/tmp
bash-3.2$ cd missing
bash: cd: missing: No such file or directory
bash-3.2$ exit
~ echo $0
-zsh
~ cd /tmp 

apres ca mouline sans me rendre la main.

Edits:
ZSH bloque sur >"$fic_err" . Si ca peut t'aider. Je comprend bien qu'on redirige un truc vers fic_err, je sais juste pas trop quoi^^

Information supplementaire, si je commente les lignes >"$fic_err" et [ -s "$fic_err" ] && cat "$fic_err" 1>&2 , la fonction est bien execute, mais je ne change au final jamais de repertoire (avec zsh).

Dernière modification par soshy (Le 01/02/2017, à 14:48)

Hors ligne

#12 Le 01/02/2017, à 15:18

pingouinux

Re : [Résolu] Etendre cd ...

La syntaxe de zsh est vraisemblablement différente de celle de bash, mais je ne la connais pas et ne pourrai pas t'aider. Désolé… sad

Dernière modification par pingouinux (Le 01/02/2017, à 15:19)

Hors ligne

#13 Le 01/02/2017, à 17:28

soshy

Re : [Résolu] Etendre cd ...

Bon, j'ai reussi !

On etait vraiment pas loin. Alors
> fichier c'est interactif, il attend du texte qui se fini par ctrl+d pour l'ecrire.
zsh ne semble pas connaitre command, mais builtin fonctionne.

Du coup au final ca donne:

cd() {
   echo -n > "$fic_err"
   if [ "$#" -eq 0 ] ; then
      builtin cd
   else
      builtin cd "$1" 2>"$fic_err" || {
         case "$1" in
             x) builtin cd "$X" 2>"$fic_err";;
             y) builtin cd "$Y" 2>"$fic_err";;
         esac
      }
   fi 
   [ -s "$fic_err" ] && cat "$fic_err" 1>&2
}

Mais encore un detail qui me chiffone ! Decidement...

Donc avec ca, tout fonctionne bien avec bash et zsh, sauf que le code retour c'est 1 a chaque fois. Une idee d'ou cela peut venir ?

Dernière modification par soshy (Le 01/02/2017, à 17:29)

Hors ligne

#14 Le 01/02/2017, à 18:24

pingouinux

Re : [Résolu] Etendre cd ...

soshy a écrit :

Donc avec ca, tout fonctionne bien avec bash et zsh, sauf que le code retour c'est 1 a chaque fois. Une idee d'ou cela peut venir ?

Quand il n'y a pas d'erreur, le fichier $fic_err est vide, et tu récupères le code de retour du test [ -s "$fic_err" ], qui n'est pas vérifié.
Essaye en remplaçant l'avant-dernière ligne de la fonction par

   [ -s "$fic_err" ] && { cat "$fic_err" 1>&2; return 1; } || return 0

(Testé en bash)

Hors ligne

#15 Le 01/02/2017, à 19:31

soshy

Re : [Résolu] Etendre cd ...

Du coup, ca fonctionne du nickel maintenant smile

Merci, et j'aurai appris plein de choses en passant aussi.

Hors ligne