Forum Astuces.divers [Terminal] Revenir à son point de départ à peu de frais

Posté par  .
Étiquettes : aucune
0
11
juin
2004
Une astuce propose d'utiliser les commandes pushd/popd, mais il y a à mon sens plus pratique encore : les variables shell prédefinies. Ainsi, pour sauvegarder l'emplacement courant :
$ export ICI=$PWD
ensuite on peut se déplacer comme on veut, et pour revenir à son point de départ :
$ cd $ICI
Quand on en n'a plus besoin :
$ export ICI=
Pratique lorsqu'on est dans une arborescence assez lourde, et qu'on a besoin de faire plusieurs allers-retours pour, par exemple installer les packages (à partir des sources) manquants à celui qu'on voulait installer initialement.
Si le nom du répertoire en cours contient des espaces, la commande export donnée ci dessus ne fonctionnera pas... Pas de problèmes :
$ export ICI="$PWD"
fonctionne tout aussi bien.
  • # pushd / popd

    Posté par  (site web personnel) . Évalué à 2.

    un pushd répertoire pour empiler le répertoire désiré et s'y rendre puis un popd pour y revenir est bien plus simple... de plus cela permet de mémoriser non un seul mais autant de répertoires que nécessaire.
  • # Encore plus simple

    Posté par  (site web personnel) . Évalué à 4.

    Au passage je rappelle que 'cd -' ramène au répertoire précédent, ce qui évite d'utiliser ce genre d'astuce si on a à faire des allers-retours entre 2 répertoires seulement.
  • # Et unset alors ?

    Posté par  . Évalué à 3.

    Plutôt que de faire un: "export ICI=", autant utiliser unset, plus propre:
    $ unset ICI

    Ceci dit, le couple pushd/popd est tout de même plus simple, non ?
    • [^] # Re: Et unset alors ?

      Posté par  . Évalué à 1.

      Voici mon avis sur la question :
      Si tu pars d'un point du système de fichier qui est assez profond dans l'arborescence,
      - si c'est juste un aller-retour, "cd - " c'est parfais.
      - si tu ne sais pas quand tu vas revenir (et surtout où tu pars), pushd/popd est adapté.
      - si tu pars pour aller ailleurs, puis de là tu pars à nouveau avec l'intention d'y revenir, etc.... mon astuce est nickel.
      Un exemple : je suis sous LFS/BLFS (cas de toutes mes machines).
      Je veux installer un nouveau package appelé A.tar.bz2.
      Comme je suis un peu organisé, je décompacte le machine dans /usr/src/packages/a.
      Je lance le .configure du package, et là... il me dit qu'il manque le package C.tar.bz2. Je sauve le chemin où je suis, et je pars pour C.tar.bz2, etc..... Ca vient de m'arriver pour installer php-gtk qui voulait php et gtk, chacun ayant ses dépendances, etc....
      Donc, dans ce cas, c'est pratique (en tout cas, c'est mon avis, et je voulais faire profiter tout le monde de la chose). Voilà, si c'est pas clair, ben je ne vois pas comment mieux expliquer ça...
      • [^] # Re: Et unset alors ?

        Posté par  (site web personnel, Mastodon) . Évalué à 2.

        Et pour le package C, tu auras besoin de F.tar.bz2, et comme tu es bien organisé, te devra te rendre dans /usr/src/packages/f. Que mettras-tu dans ta variable ICI ? Et si F a besoin de J ?


        C'est une bonne astuce certe mais pas aussi pratique que les autres solutions proposées. Et puis, c'est vachement long à ecrire a chaque fois 'export $ICI=$PWD ' , pas en terme de longeur de chaine, mais en manipulation sur le clavier ;-)
        • [^] # Re: Et unset alors ?

          Posté par  . Évalué à 1.

          L'avantage des variables, c'est que tu peux en créer autant que tu veux....
          Allez, export C1=$PWD à export Cn, ça devrait suffire, c'est pas trop long à taper....
          Si vraiment tu as la flemme de taper ça, crées-toi un alias ou un shell.....
          • [^] # Re: Et unset alors ?

            Posté par  (site web personnel, Mastodon) . Évalué à 2.

            ou bien je peux utiliser pushd/popd ;-)
            • [^] # Re: Et unset alors ?

              Posté par  . Évalué à 1.

              Oui, mais pushd/popd gère une pile....
              Avec mon système, tu peux aller de C17 à C2 sans virer C3, C4, C5, ... C16 de ton environnement, non ?
              Ca te permet ensuite d'aller à C7, chose que tu ne peux pas faire avec pushd/popd (ou alors je n'ai vraiment rien compris au système, ce qui est possible, je n'ai pas la prétention de tout connaître, loin s'en faut !).....
              • [^] # Re: Et unset alors ?

                Posté par  (site web personnel, Mastodon) . Évalué à 2.

                Tu peux aussi le faire. Pour plus d'info, c'est dans le man bash, avec une recherche sur popd,pushd ou meme dirs (avec un s).

                Bah, de toute facon ton systeme est bien aussi, c'est une question d'habitude, si tu t'en sors bien avec les C1..C17, pourquoi changer ? (sauf peut etre pour essayer ;-) )
  • # pourquoi

    Posté par  (site web personnel) . Évalué à 2.

    pourquoi
    "export FOO="
    et pas
    "unset FOO" ?
    • [^] # Re: pourquoi

      Posté par  . Évalué à 1.

      Pour ne pas faire comme tout le monde !
      Après tout, les deux procurent le même résultat.... C'est juste une question de goût....
      Et puis avec la complétion automatique sous vi, ça ne fait qu'une commande qui se répète lorsque tu rédiges un script-shell.....
  • # Et pour garder une trace écrite ...

    Posté par  (site web personnel) . Évalué à 0.

    Envoyer le résultat de la variable dans un fichier temporaire (du style ~/tmp/pwd) par exemple. Ensuite, après un reboot, faire un cd `cat ~/tmp/pwd` et hop le tour est joué ;-)
  • # .

    Posté par  . Évalué à 2.

    en moin de lettres ( mais plus groumand en recources ):

    bash


    lorsque l'on veux revenire en arrière: ctrl-D
  • # Variante

    Posté par  (site web personnel) . Évalué à 1.

    Pourquoi faire un export si on reste dans le même shell ?
    Penser au problème des espace dans les noms de répertoires !
    Pour que la commande de rappel soit encore plus courte, mettre 'cd' dedans.

    > ICI="cd '$PWD'"
    ...
    > $ICI
    > unset ICI

    Mais on peut faire la même chose avec des alias :
    > alias ICI="cd '$PWD'"
    ...
    > ICI
    > unalias ICI

    Et ça marche aussi avec ksh.

    Mainteneur de LiquidPrompt - https://github.com/nojhan/liquidprompt

    • [^] # Re: Variante

      Posté par  (site web personnel) . Évalué à 2.

      Et que se passe-t-il si $PWD contient une simple quote ' ? ça ne marche pas.

      Il faudrait:
      ICI=(cd "$PWD")

      et pour revenir au point de départ:
      "${ICI[@]}"

      Finalement ce n'est peut être pas si simple.
  • # Encore mieux fait maison (pour les bashistes)

    Posté par  . Évalué à 1.

    A coller dans son .bashrc ou ailleurs... Attention, après on ne peut plus s'en passer!
    function g() {
    	local CFG=$HOME/.cdirs
    
    	# no arg => list bookmarks
    	if [ $# = 0 ]; then
    		if [ -f $CFG ]; then
    			nl $CFG
    		else
    			echo "No bookmarks file [$CFG]"
    		fi
    
    	# print help
    	elif [ $1 = help ]; then
    
    		cat <<EOF
     g: Bookmarks your favorite directories
     Usage: g [ directory | regex | number | "del" | "edit" ]
    EOF
    		
    	# number => go to n-th bookmark
    	elif [[ $1 =~ [0-9]+ ]]; then
    		dir=`sed -ne ${1}p $CFG`
    		if [ "$dir" != "" ]; then
    			cd $dir
    		else
    			echo "Not found"
    		fi
    
    	# edit bookmarks
    	elif [ $1 = "edit" -o $1 = "del" ]; then
    		vi $CFG
    
    	# grep bookmarks, add bookmark if not found and directory exists
    	else
    		dir=`grep "$1" $CFG | sed -ne 1p`
    		if [ "$dir" != "" ]; then
    			cd $dir
    		elif [ -d $1 ]; then
    			cd $1
    			pwd >> $CFG
    		else
    			echo "No such directory"
    		fi
    	fi
    }
    
    
    • [^] # Re: Encore mieux fait maison (pour les bashistes)

      Posté par  . Évalué à 1.

      Oui, oui, pas mal cette fonction. Juste mon petit grain de sel : Quand je suis dans un répertoire, je veux pouvoir utiliser simplement . (ou ..) pour créer un signet sur le réperoire courant ou parent. Tel que, le script ne fonctionne pas avec ., parce que grep sort tout le fichier ... mais ça dépend peut-etre des versions de grep ... Je voulais aussi pouvoir trier le fichier de temps en temps. J'ai donc ajouté une option "sort".
       	# edit bookmarks
      	elif [ $1 = "edit" -o $1 = "del" ]; then
      		vi $CFG
      	elif [ $1 = "sort" ]; then
      		sort -u -k 1 -o "$CFG" "$CFG"
      		cat $CFG
      	# grep bookmarks, add bookmark if not found and directory exists
      	else
                     else
                     # If it is a . or a .. go into the dir
                     if [ $1 = '.'  -o  $1 = '..' ]; then
      			cd $1
      			bkm=$(pwd)
      		fi
                      # Then use variable bkm, not the $1
      		dir=`grep "$bkm" $CFG | sed -ne 1p`
      		if [ "$dir" != "" ]; then
      			cd $dir
      		elif [ -d $bkm ]; then
      			cd $bkm
      			pwd >> $CFG
      		else
      			echo "No such directory"
      		fi
      
      Rien de bien révolutionnaire, mais ça peut etre pratique ... ;)
  • # un peu de zsh pour la route

    Posté par  (site web personnel) . Évalué à 2.

    Si vous utilisez zsh, hash permet de retenir des chemins.

    hash -d zap=/data/temp/
    Et ensuite, cd ~zap permet d'aller directement dans /data/temp/

    J'en ai quelques uns comme ça dans on zshrc qui me permettent d'aller dans les répertoires à nom un peu long, et aussi quand je change de machine de ne pas avoir à me rappeler si c'est /Users/manu/Vrac/tmp/ ou /home/manu/temp le chemin de mon répertoire à la con.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.