Pages : 1
#1 Le 30/01/2017, à 15: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, à 17:48)
Hors ligne
#2 Le 30/01/2017, à 17: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.
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, à 17: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, à 17: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é...
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 le problème solutionné, 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, à 17:46
- soshy
Re : [Résolu] Etendre cd ...
Watael, ce hero
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
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, à 18:05)
Hors ligne
#6 Le 31/01/2017, à 16: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, à 00: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
Dernière modification par soshy (Le 01/02/2017, à 00:39)
Hors ligne
#8 Le 01/02/2017, à 07: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, à 07:44)
Hors ligne
#9 Le 01/02/2017, à 11:58
- soshy
Re : [Résolu] Etendre cd ...
C'est parfait ! Enfin... Avec bash uniquement
Avec zsh je change juste pas de repertoire pour une raison que j'ai pas encore trouve...
Hors ligne
#10 Le 01/02/2017, à 12:37
- pingouinux
Re : [Résolu] Etendre cd ...
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, à 13: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, à 13:48)
Hors ligne
#12 Le 01/02/2017, à 14: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é…
Dernière modification par pingouinux (Le 01/02/2017, à 14:19)
Hors ligne
#13 Le 01/02/2017, à 16: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, à 16:29)
Hors ligne
#14 Le 01/02/2017, à 17:24
- pingouinux
Re : [Résolu] Etendre cd ...
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, à 18:31
- soshy
Re : [Résolu] Etendre cd ...
Du coup, ca fonctionne du nickel maintenant
Merci, et j'aurai appris plein de choses en passant aussi.
Hors ligne