Forum Programmation.shell Recherche d'une fonctionnalité zsh / bash

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
3
28
oct.
2022

Bonjour,

Il y a fort longtemps, quand j'utilisais zsh comme shell principal, j'usais et abusais d'une fonctionnalité très pratique qui permettait de mettre de coté la ligne de commande courante pour pouvoir en faire une autre. Une fois la 2ème commande exécutée, la ligne de commande n°1 était restaurée.

Je trouve ça pratique car souvent, quand il me manque une info pour compléter une commande en cours. Je n'ai pas d'autre choix que d'annuler la commande pour lancer la commande me permettant d'avoir cette info, puis de retaper ma commande.

Cas d'utilisation: je veux éditer un fichier dans le rep courant:

# vim # ah j'ai oublié le nom du fichier - raccourci clavier permettant de mettre de coté la commande courante

# ls -l # exécution de commande #2 pour retrouver le nom du fichier
...
# vim  # restauration de la commande initiale.

Ma question, est-ce que ça existe avec bash ?

Salutations

  • # Ctrl-z

    Posté par  . Évalué à 2. Dernière modification le 28 octobre 2022 à 16:28.

    pour suspendre le processus en cours et revenir à bash: Ctrl-z
    pour réactiver le processus suspendu et le passer en arrière plan: bg au prompt bash
    pour réactiver le processus suspendu et reprendre la main dessus: fg au prompt bash

    • [^] # Re: Ctrl-z

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

      Je me suis mal exprimé, ce n'est pas tout à fait ce que je recherche:

      Ce que tu décris fonctionne pour les programmes en cours de fonctionnement. Moi je cherche la même chose, mais pour la commande en cours d'édition, pas encore exécutée.

      je me souviens d'un raccourci zsh permettant de sauvegarder la ligne de commande courante (non exécutée) afin de libérer celle-ci le temps d'exécuter une autre commande. la cli initiale (en cours d'édition) est ensuite restaurée.

  • # Ctrl-u/Ctrl-y

    Posté par  . Évalué à 10.

    Je ne connais pas l’équivalent exact en bash avec la restauration automatique, mais c'est possible de faire Ctrl-u pour supprimer la ligne et Ctrl-y pour la coller à nouveau, avec bash et zsh.

    Dans zsh le widget s'appelle push-line le terme peut aider pour trouver l’équivalent en bash.

  • # La solution est presque dans la question

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

    Sans utiliser une fonctionnalité particulière, j'utilise l'historique du shell de cette façon :

    • Ctrl-a pour aller en début de ligne
    • Ajout de # pour basculer toute la ligne en commentaire
    • Enter pour passer à la commande suivante.
    • pour revenir à la commande en commentaire.
    • Suppression de #, édition de la ligne, et validation.

    Debian Consultant @ DEBAMAX

  • # en utilisant la commande history du bash

    Posté par  . Évalué à 3. Dernière modification le 29 octobre 2022 à 16:27.

    Bonjour

    Je liste (ou n'importe quelle autre commande) deux noms de fichiers.

    Mais comme j'ai oublié les noms des fichiers que j'avais listés dans la ligne de commande que j'avais précédemment lancée mais que je sais que c'est le premier nom que j'avais donné, alors, après avoir tapé ma commande (par exemple head -1), je rappelle le nom du premier fichier en entrant : !:1

    michel@deb115:~$ ls .bashrc .bash_history
    .bash_history  .bashrc
    michel@deb115:~$ head -1 !:1
    michel@deb115:~$ head -1 .bashrc
    # ~/.bashrc: executed by bash(1) for non-login shells.
    michel@deb115:~$

    Même chose si j'avais voulu rappeler le nom du deuxième fichier, mais en mettant cette fois un 2 : !:2

    michel@deb115:~$ ls .bashrc .bash_history
    .bash_history  .bashrc
    michel@deb115:~$ head -1 !:2
    michel@deb115:~$ head -1 .bash_history
    bc <<< "obase=2;ibase=16;$maVar";
    michel@deb115:~$
    • [^] # Re: en utilisant la commande history du bash

      Posté par  . Évalué à 3. Dernière modification le 28 octobre 2022 à 21:34.

      J'aurais aussi pu
      remplacer le 1 par un ^ pour demander le premier

      et, dans cet exemple où il n'y avait que 2 noms de fichier,
      remplacer le 2 par un $ pour demander le dernier.

      • [^] # Re: en utilisant la commande history du bash

        Posté par  . Évalué à 4. Dernière modification le 29 octobre 2022 à 16:25.

        On s'habitue très vite au confort, et du coup, j'avais oublié de spécifier dans mes message précédents que que sur mon système, j'ai activé depuis longtemps l'option histverify de mon shell bash

        en ajoutant, dans mon fichier de configuration ~/.bashrc
        la ligne de commande suivante :
        shopt -s histverify

        NOTE :
        Il me semble que, pour le shell zsh, l'option histverify est activée par défaut.

        C'est grâce à cette option que la ligne de commande entrée :

        michel@deb115:~$ head -1 !:1

        s'affiche d'abord en clair afin de me permettre de vérifier si la ligne de commande qui va être lancée correspond bien à ce que je voulais lancer :

        michel@deb115:~$ head -1 .bashrc

        Toujours en utilisant les fonctionnalités de la commande history,
        on peut lister les dernières commandes lancées pour récupérer le numéro d'enregistrement qui sera affiché en lançant simplement la commande history
        et on peut utiliser le premier, deuxième, etc. argument donné dans cette ligne de commande
        en spécifiant le numéro d'enregistrement de la commande et le numéro d'ordre de l'argument utilisé :

        Par exemple, si dans le retour de la commande history,
        j'ai la ligne suivante qui s'affiche :

           31  apt policy gawk ncdu vim-nox

        Je peux récupérer le troisième argument (ncdu) qui avait été donné à la commande apt dans cette ligne de commande en entrant : !31:3

        Donc, si je veux installer le paquetage ncdu
        je pourrais entrer la ligne de commande suivante :

        apt install !31:3

        Si l'option du shell histverify n'est pas activée, la ligne de commande sera directement lancée, sinon, elle sera d'abord affichée et on pourra choisir de la lancer (ou pas).

        • [^] # Re: en utilisant la commande history du bash

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

          Je confirme que l'option histverify est un "must-have" si on s'amuse beaucoup avec l'historique.

          Dans le même ordre d'idée, j'utilise énormément !$ qui correspond au dernier argument de la précédente commande:

          mkdir /chemin/vraiment/tres/long
          vim !$/plop.md

          Il y a également $* qui correspond à l'ensemble des arguments de la précédente commande

          mkdir dir1 plop foobar youplaboom
          chgrp users !*

          En plus d'utiliser les numéros de commande de l'historique, on peut faire des recherches:

          # rappel la dernière commande vim:
          !vim
          
          # affichage du dernier fichier ouvert dans vim:
          
          ls -l $vim:$

          mais bon on s'éloigne du sujet initial :)

        • [^] # Re: en utilisant la commande history du bash

          Posté par  . Évalué à 2. Dernière modification le 29 octobre 2022 à 09:09.

          Bonjour

          Dans mon message du 28/10/22 à 21:25

          j'aimerai remplacer l'extrait suivant :

          Même chose si j'avais voulu rappeler le nom du deuxième fichier, mais en mettant cette fois un 2 : '!:2'

          par :

          Même chose si j'avais voulu rappeler le nom du deuxième fichier, mais en mettant cette fois un 2 : !:2


          et dans mon message du 28/10/22 à 22:34

          j'aimerai remplacer l'extrait suivant :

          en lançant la ligne de commande suivante :

          shopt -s histverify

          par :

          en ajoutant, dans mon fichier de configuration ~/.bashrc
          la ligne de commande suivante :

          shopt -s histverify

          NOTE :
          Il me semble que, pour le shell zsh, l'option histverify est activée par défaut.

  • # ctrl-q sur zsh

    Posté par  . Évalué à 2. Dernière modification le 04 novembre 2022 à 16:37.

    message supprimé

Suivre le flux des commentaires

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