IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Vos scripts shell


Sujet :

Shell et commandes GNU

  1. #101
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    J'ai trouvé ça mais ça n'a rien d'extra-ordinaire. Je me demandais si on pouvais faire bcp mieux.

  2. #102
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    je ne vois pas l'intérêt d'un tel programme. Ça paraît bien lourd pour quelques opérations triviales.

  3. #103
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Petit correctif à la ligne 10 de _type.command

    Au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ $_path =~ (*) ]] && _path=$_path{1: -1}
    Il fallait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ "$_path" =~ \(*\) ]] && _path=${_path: 1: -1}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     $ type _type.command
    _type.command is a function
    _type.command ()
    {
        local command="$1";
        local _type=$(type -t "$2");
        if [[ "$_type" == "file" ]]; then
            local _path=$(string.word.last "$(type $2)");
            [[ "$_path" =~ \(.*\) ]] && _path=${_path:1: -1};
            $command "$_path";
        else
            type "$1";
        fi
    }
    $

  4. #104
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    une simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    _typeCommand ()
    {
        if test "$(type -t "$2")" = "file"
        then
            $1 $(path=$(stringWordLast "$(type $2)"); echo "${path//[()]}")
        else
            type "$1"
        fi
    }
    pas testé, parce qu'il n'est pas dit quels arguments attend la fonction.

  5. #105
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $1 $(path=$(stringWordLast "$(type $2)"); echo "${path//[()]}")
    Merci ! ça marche à merveille !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    10:18:43 ~ -1- $ type man
    man is /usr/bin/man
    10:19:13 ~ -1- $ type.file man
    /usr/bin/man: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=f421457c024fcd196f0ac9ccfc8796f59bddb3c4, stripped
    10:19:15 ~ -1- $ type file
    file is hashed (/usr/local/bin/file)
    10:19:17 ~ -1- $ type.file file
    /usr/local/bin/file: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=92eeb60f60d4cb4cc7cc8401bbc6db71cfe89820, stripped
    10:19:18 ~ -1- $
    Ça prend bien en compte les deux cas; chemin avec et sans parenthèses.
    Il faut que je regarde ça de plus près.

  6. #106
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Ok, j'avais pourtant pris note mais je n'ai pas pensé à l'utiliser

    *** replace substring (no more sed for this !)
    use ${var/pat/pat} to replace just one occurence
    use ${var//pat/pat} to replace all occurences

    example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ url="https://distrowatch.com/dwres-mobile.php?resource=ratings&distro=sparky"
    $ echo ${url}
    https://distrowatch.com/dwres-mobile.php?resource=ratings&distro=sparky
    $ echo ${url/distrowatch.com/google.com}
    https://google.com/dwres-mobile.php?resource=ratings&distro=sparky
    $

  7. #107
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Nom du script : package.describe, package.whatprovides

    Compatible avec: Bash

    Descriptif:
    1. package.describe : affiche le descriptif d'un paquet sur un système reposant sur le framework APT (Debian et dérivés)
    2. package.whatprovides : affiche le paquet qui procure une commande (ou un fichier) sur un système Debian ou dérivé.

    Dépendances :
    1. apt
    2. grep-dctrl, fournit par le paquet dctrl-tools

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    $ type package.describe
    package.describe is a function
    package.describe ()
    {
        apt-cache show "$1" | grep-dctrl -s Description-en -
    }
    $
     
    $ type package.whatprovides
    package.whatprovides is a function
    package.whatprovides ()
    {
        dpkg -S "$1" | cut -f1 -d: | sort | uniq
    }
    $
    Voici un exemple d'éxecution des deux commandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    $ package.describe sshpass
    Description-en: Non-interactive ssh password authentication
     SSH's (secure shell) most common authentication mode is called "interactive
     keyboard password authentication", so called both because it is typically
     done via keyboard, and because openssh takes active measures to make sure
     that the password is, indeed, typed interactively by the keyboard. Sometimes,
     however, it is necessary to fool ssh into accepting an interactive password
     non-interactively. This is where sshpass comes in.
     .
     SECURITY NOTE: There is a reason openssh insists that passwords be typed
     interactively. Passwords are harder to store securely and to pass around
     securely between programs. If you have not looked into solving your needs
     using SSH's "public key authentication", perhaps in conjunction with the ssh
     agent (RTFM ssh-add), please do so before being tempted into using this
     package.
    $ package.whatprovides bin/grep-dctrl 
    dctrl-tools
    $

  8. #108
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dpkg -S "$1" | cut -f1 -d: | sort | uniq
    On pourra remplacer avantageusement | sort | uniq par | sort -u. Le cas où l'enchaînement des 2 commandes est obligatoire, c'est quand on compte les éléments. Sinon, sort seul suffit.

    Et si l'ordre n'a pas d'importance, on peut même faire un seul awk pour remplacer tous les derniers étages de la conduite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dpkg -S "$1" | awk -F: '{a[$1]++;} END{for (i in a) print i;}'
    gawk peut trier. Mais cela peut s'avérer plus galère qu'un simple sort.

  9. #109
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Salut Flodelarab !

    Merci pour le code AWK c'est tip-top !
    par contre pour sort -u j'ai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    13:36:07 /usr/share/doc/ubuntu-keyring -1- $ sort -u /tmp/out
    dctrl-tools: /usr/bin/grep-aptavail
    dctrl-tools: /usr/bin/grep-available
    dctrl-tools: /usr/bin/grep-dctrl
    dctrl-tools: /usr/bin/grep-debtags
    dctrl-tools: /usr/bin/grep-status
    emacs24-bin-common: /usr/bin/grep-changelog.emacs24
    13:36:10 /usr/share/doc/ubuntu-keyring -1- $ sort  /tmp/out
    dctrl-tools: /usr/bin/grep-aptavail
    dctrl-tools: /usr/bin/grep-available
    dctrl-tools: /usr/bin/grep-dctrl
    dctrl-tools: /usr/bin/grep-debtags
    dctrl-tools: /usr/bin/grep-status
    emacs24-bin-common: /usr/bin/grep-changelog.emacs24
    13:36:28 /usr/share/doc/ubuntu-keyring -1- $

  10. #110
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    arf, désolé...

  11. #111
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    La solution avec AWK est nettement plus rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $ command ls -1 /usr/lib/ > /tmp/allthelibs
    $ for i in {1..1000}; do echo $i; shuf /tmp/allthelibs >> /tmp/allthelibs.shuffled.1000x; wc -l /tmp/allthelibs.shuffled.1000x; done
    [...]
    $ wc -l /tmp/allthelibs.shuffled.1000x
    1406405 /tmp/allthelibs.shuffled.1000x
    $ time (awk '{A[$1]=""} END {for (i in A){print i}}' /tmp/allthelibs.shuffled.1000x > /dev/null)
     
    real    0m0.288s
    user    0m0.284s
    sys     0m0.000s
    $ time (sort /tmp/allthelibs.shuffled.1000x | uniq > /dev/null)
     
    real    0m2.176s
    user    0m5.728s
    sys     0m0.656s
    $ time (sort -u  /tmp/allthelibs.shuffled.1000x  > /dev/null)
     
    real    0m2.258s
    user    0m5.672s
    sys     0m0.696s
    $

  12. #112
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    pourquoi command ?

    PS: quand la sortie standard de ls n'est pas reliée à un terminal, l'affichage se fait par défaut sur une seule colonne.

  13. #113
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Pour éviter l'alias ls

    $ type ls
    ls is aliased to `ls -lh'
    $
    comment t'as fait pour formatter ls et command sur le forum ?

  14. #114
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Citation Envoyé par yacinechaouche Voir le message
    La solution avec AWK est nettement plus rapide
    Trier, c'est long. C'est connu. Ce n'est pas tellement le problème de awk ou pas awk. C'est la question de tri, ou pas tri.

  15. #115
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    pour éviter l'alias, ajoute un anti-slash devant la commande : \ls.

    pour mettre une commande en ligne, utilise la balise [c] (et [\c] pour fermer).

    @Flodelarab, même en triant (PROCINFO["sorted_in"]), awk est plus rapide.

  16. #116
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Super astuce le \ ! merci N_BaH

  17. #117
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Ok apparemment "ls" et 'ls' aussi.
    Je dois révisier pourquoi j'ai utilisé command.
    Je crois qu'à un moment donné j'ai du utiliser command grep dans un de mes scripts parce que grep était un alias de grep --color=always,
    ce qui s'est avéré être une mauvaise idée.
    Du coup lorsque mes scripts utilisaient grep et redirigaient la sortie vers un fichier,
    celui-ci contenait plein de code couleurs.
    J'ai du donc recourir à command grep.
    Il faudrait que je puisse reproduire ça 1 2 c 4 pour voir.
    Mais pour l'instant,
    c'est bon week-end pour moi !

  18. #118
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Quand on voit le résultat de sort -u et sort | uniq, on comprend que sort tri dabord et dédoublonne ensuite.

    Tandis que pour awk, on lui dit de dédoublonne pour trier ensuite...
    C'est donc pas étonnant qu'il soit plus rapide

  19. #119
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    (PROCINFO["sorted_in"])
    Merci de rappeler que cette simple affectation est suffisante. Je me casse les pieds à chaque fois en utilisant un tableau source et un tableau destination.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ dpkg -S vim | awk -F: '{a[$1]++;} END{PROCINFO["sorted_in"]="@ind_str_asc";for (i in a) print i;}'

  20. #120
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    PROCINFO est une extension GNU; un GNUism.

Discussions similaires

  1. Script shell
    Par anzar dans le forum Linux
    Réponses: 4
    Dernier message: 03/12/2004, 14h41
  2. [JSP] script shell
    Par goolix dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/08/2004, 09h08
  3. Exécution d'un script shell
    Par Manu0086 dans le forum Linux
    Réponses: 8
    Dernier message: 15/06/2004, 16h31
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo