Forum Programmation.shell [Résolu]Copier ou éxécuter un résultat de commande shell (stdout)

Posté par . Licence CC by-sa.
Tags : aucun
1
29
mar.
2019

Bonjour,

J'ai fait un fichier avec une liste de commandes utiles à utiliser dans une console.
Parfois certaines lignes sont longues et les copier à la main n'est pas envisageable.

Je me suis alors mis à chercher d'une commande qui pourrait copier la ligne qui m'intéresse dans le presse papier pour la recoller dans le prompt afin de l'éxécuter. Mais à priori la notion de presse papier va de paire avec X. Je peux copier dans vim, mais pas coller en dehors de vim.

Pour ça je cherche une alternative, c'est à dire, un moyen de copier la ligne qui m'intéresse (je l'extrais et l'affiche avec grep par ex. ou sed, ou cat (ou awk ou peu importe), mais ça ne fait jamais que l'afficher. Je cherche à envoyer la commande dans un pipe ou ailleurs (dans une variable ?) afin de pouvoir l'éxécuter dans la foulée. Bien sûr toutes mes commandes vont passées en alias, et ce sera facile de les éxécuter et le problèmene se posera plus.

Mais par simple curiosité, et parce que ça peut servir ailleurs à d'autre moments, j'aimerais savoir comme éxécuter ces commandes directement après les avoir extraites/affichées.

Je vous remercie par avance de votre aide. :)

  • # simple :)

    Posté par . Évalué à 3. Dernière modification le 30/03/19 à 11:08.

    Tu utilises $().

    Exemple:

        ~$ echo "whoami && pwd" >> cmd
        ~$ echo "netstat -lt" >> cmd
        ~$ $(grep netstat cmd)
        Active Internet connections (only servers)
        Proto Recv-Q Send-Q Local Address           Foreign Address         State      
        tcp        0      0 localhost:mysql         0.0.0.0:*               LISTEN     
        tcp        0      0 0.0.0.0:62354           0.0.0.0:*               LISTEN     
        tcp        0      0 0.0.0.0:ftp             0.0.0.0:*               LISTEN     
        tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
        tcp        0      0 localhost:ipp           0.0.0.0:*               LISTEN     
        tcp6       0      0 [::]:http               [::]:*                  LISTEN     
        tcp6       0      0 [::]:ftp                [::]:*                  LISTEN     
        tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
        tcp6       0      0 localhost:ipp           [::]:*                  LISTEN
    • [^] # Re: simple :)

      Posté par . Évalué à 1.

      Bonjour et merci pour ton aide. :)

      J'arrive pas à comprendre comment faire, alors je te propose un cas concret :

      Dans mon fichiers (qui s'appelle "commandes") avec plein de commandes dedans, j'ai par exemple celle-ci, qui sert à afficher une arboresence des dossiers :

      ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
      Je l'extrais du fichier avec grep :

      grep "sed -e" commandes
      ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
      Sauf que je ne sais pas quoi faire pour l'éxécuter directement, à la place de juste afficher cette ligne. Parce que je suis en console TTY et j'ai pas accès à la souris pour copier/coller cette ligne afin de l'éxécuter.

      • [^] # Re: simple :)

        Posté par . Évalué à 3.

        Salut,

        tu peux tout simplement piper le résultat de ton grep dans sh:

        grep "sed -e" commandes | sh

      • [^] # Re: simple :)

        Posté par . Évalué à 2. Dernière modification le 30/03/19 à 08:26.

        J'arrive pas à comprendre comment faire

        $() exécute la sortie de la commande qu'il y a dans les parenthèses.

        Exemple :

        ls
        => toto tata
        (j'ai deux fichiers, toto et tata)

        $(ls)
        => toto : command not found
        (il a tenté d'exécuter toto tata, qui est donc le résultat de la commande ls, comme si toto était une commande avec comme paramètre tata)

        Autre exemple plus proche de ce que tu cherches à faire :

        echo ls
        => ls

        $(echo ls)
        => toto tata

        Donc il te conseille de faire un $(sed blablabla) : la commande sed affichera des commandes, et donc elles seront exécutées

        Sinon le | sh conseillé dans un autre commentaire marchera tout autant.

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: simple :)

        Posté par (page perso) . Évalué à 1. Dernière modification le 30/03/19 à 09:22.

        Comme l'explique Gérald, un shell va exécuter ce qui se trouve entre entre les $( … ), ou sous son autre forme, entre des apostrophes.

        ` commandes à exécuter `
        david:~>cat commandes
        ls -l commandes
        echo coucou
        
        david:~>`grep "ls" commandes`
        -rw-r--r--  1 david  wheel  29 30 mars  09:16 commandes

        Par contre, si sous un terminal le presse-papier n'existe pas stricto-sensu, le copier-coller existe, lui.
        Il faut sélectionner un texte avec la souris et le coller en appuyant sur le bouton droit (ou milieu, ou les deux boutons selon les OS) voire avec la séquence ctrl-insert.
        Pour que cela fonctionne sous vim, il faut configurer la souris en mode visual:

        :set mouse=v

    • [^] # Re: simple :)

      Posté par (page perso) . Évalué à 4. Dernière modification le 30/03/19 à 12:14.

      Ça ne serait pas plus simple d'utiliser des alias (ou des fonctions) ?

      ~$ echo "alias netlt='netstat -lt'" >> .bash.aliases
      ~$ netlt

      « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

  • # Problème résolu. :)

    Posté par . Évalué à 2.

    Bonjour, et merci à tous pour vos commentaires. :)

    @Pnchbllz :

    grep "sed -e" commandes | sh
    

    Cette commande marche parfaitement, elle fait le job !

    @gUI et @David Marec :

    J'ai testé les commandes proposées (et merci pour l'explication du post de Gérald) mais à priori elles ne fonctionnent pas à tous les coups. Pour cette raison je vais privilégier | sh ou | bash.

    Exemples :

    user@machine:~$ grep "cut" com
    lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2
    
    user@machine:~$ lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2
    falkon
    
    user@machine:~$ (grep "cut" com)
    lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2
    
    user@machine:~$ grep "cut" com | sh
    falkon
    
    user@machine:~$ `grep "cut" com`
    lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
          Output information may be incomplete.
    lsof: status error on |: No such file or directory
    lsof: status error on cut: No such file or directory
    lsof: status error on -f: No such file or directory
    lsof: status error on 1: No such file or directory
    lsof: status error on -d: No such file or directory
    lsof: status error on ": No such file or directory
    lsof: status error on "|: No such file or directory
    lsof: status error on uniq: No such file or directory
    lsof: status error on |: No such file or directory
    lsof: status error on tail: No such file or directory
    lsof: status error on -n: No such file or directory
    lsof: status error on +2: No such file or directory
    lsof 4.89
     latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
     latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
     latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
     usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
     [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
     [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
    Use the ``-h'' option to get more help information.
    

    Par contre pour d'autres commandes plus simples ça fonctionne bien. Néanmoins je me servirais sûrement de cette forme dans un script.

    @deuzene

    Merci pour l'idée de l'alias, mais j'ai déjà évoqué son utilisation dans mon premier post, ce n'est pas ce que je cherchais. :)

    Bonne soirée les linuxiens.

Suivre le flux des commentaires

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