Partage
  • Partager sur Facebook
  • Partager sur Twitter

[bash] Script vs commande : résultats différents

    29 octobre 2019 à 23:48:58

    Salut !

    Considérons le code suivant (dans une fonction de mon fichier .bash_aliases) :

    action="ls -B -I \"*.c\""
    echo $action
    $action

    Quand j’exécute la fonction j'ai bien l'echo qui annonce la commande qui suit, puis un résultat similaire à

    ls -B

    donc en ignorant les arguments suivants. Puis, lorsque je copie-colle le résultat de l'echo (donc normalement exactement ce qui a été exécuté juste après) dans mon terminal et que j'exécute cette commande, j'obtiens bien le résultat attendu.

    Je ne comprends pas d'où vient cette différence de comportement. o_O

    En vous remerciant pour votre aide,

    numero_744

    PS : la fonction complète, dont le rôle est d'afficher le contenu d'un dossier en séparant les fichiers par extension pour certaines extensions, puis d'afficher les autres fichiers et dossiers :

    ll() {
    	extensions=".h .c .cpp .o"
    	action="ls -B"
    	for e in $extensions
    	do
    		ls *$e 2> /dev/null
    		action="$action -I \"*$e\""
    	done
    	echo $action
    	$action # C'est ici que je n'ai pas le résultat attendu.
    }

    -
    Edité par numero_744 29 octobre 2019 à 23:51:18

    • Partager sur Facebook
    • Partager sur Twitter
      30 octobre 2019 à 2:29:34

      salut,

      c'est parce que les guillemets sont protégés par bash lors de l'exécution.
      ajoute un set -x avant $action pour l'observer.

      mais, de toute façon, on n'utilise pas ls dans un script, surtout bash :

      shopt -s extglob
      printf '%s\n' "$tonRep"/!(*.ext1|*.ext2|*.extN)

      et pis, c'est tout. ;)

      -
      Edité par dantonq 30 octobre 2019 à 10:19:50

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        30 octobre 2019 à 9:38:27

        Bonjour,

        Merci pour cette réponse. Je comprends mieux ce qu'il se passe.

        Sans utiliser ls, puis-je conserver la coloration et un équivalent de l'option -B ? Mon but étant de faire exactement comme ls, mais en regroupant par extensions (un drapeau permet de trier par extensions mais ne fait pas de regroupements).

        J'ai essayé les commandes que vous indiquez, la seconde me demande de la compléter sur la ligne suivante. Je pense que c'est à cause du ' ouvrant sans fermant.

        EDIT : Une idée qui me semble bourrine mais qui marche :

        ll() {
        	extensions=".h .c .cpp .o"
        	action="ls --color=auto -B"
        	for e in $extensions; do
        		ls *$e 2> /dev/null
        		for f in *$e; do
        			action="$action -I $f"
        		done
        	done
        	$action
        }
        

        Mais si vous avez plus propre, je prends !

        -
        Edité par numero_744 30 octobre 2019 à 10:02:29

        • Partager sur Facebook
        • Partager sur Twitter
          30 octobre 2019 à 10:34:07

          j'ai corrigé mon message : il y a des trucs qui étaient passés à la trappe; je ne sais pas pourquoi. peu importe.

          la coloration syntaxique est propre à ls.

          ton code indique que tu veux afficher d'abord les fichiers ayant une extension stockée dans extensions
          puis afficher les autres

          declare -a extensions=( h c cpp o )
          for ext in "${extensions[@]}"
          do
             printf '%s\n' ./*."$ext"
          done
          exts=$(IFS='|'; echo "${extensions[*]}")
          printf '%s\n' ./!(*.@(${exts}|~))

          pour la coloration, ça se bricole pour les fichiers dont on connait l'extension; avec un tableau associatif prenant en indices les extensions, et en valeurs le format souhaité.

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            30 octobre 2019 à 17:31:17

            Si le but est juste d'afficher un résultat de ls, ls -B "$tonRep"/!(*.ext1|*.ext2|*.extN) ferra le job.

            • Partager sur Facebook
            • Partager sur Twitter
              30 octobre 2019 à 18:54:57

              ça ne fonctionnera pas comme le souhaite numero_744, entre autre parce que ça va descendre dans les répertoires indiqués par le développement de chemins.
              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                31 octobre 2019 à 17:03:54

                Pas faux, mais ls a une option pour bloquer cela: -d.

                • Partager sur Facebook
                • Partager sur Twitter

                [bash] Script vs commande : résultats différents

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown