4 votes

récursion dans le shell script

J'apprends la commande Linux et je m'exerce et essaie d'écrire un shell basique script qui liste tous les fichiers et les fichiers dans les sous-dossiers, comme ls * en utilisant la récursion.

#!/bin/bash

# list-all: one command to list them all!!!!

listit () {
        if [ -d "$1" ]
        then
                listit "$1"
        else
                echo "$1"
        fi  
}

ls | while read items; do
        listit "$items"
done

Cependant, le résultat montre :

./list-all: line 16:  1101 Done                    ls
      1102 Segmentation fault: 11  | while read items; do
    listit "$items";
done

Est-ce parce que l'interpréteur de commandes ne permet pas la récursion ? Aidez-moi, merci !

2voto

kojiro Points 24374

Le shell supporte certainement la récursion. Mais votre fonction prend des arguments, et vous lui passez stdin. En plus de cela, vous ne devriez vraiment pas analyse syntaxique de la sortie de ls . Considérez ceci :

listit() {
    while [ "$1" ]; do
        if [ -d "$1" ]; then
            listit "$1"/*
        else
            printf '%s\n' "$1"
        fi
        shift
    done
}

listit *

Si vous voulez vraiment lire stdin, vous devrez réécrire listit pour le faire. C'est délicat, car vous n'avez qu'une seule entrée standard, et chaque appel récursif essaierait de la posséder. Les noms de fichiers sont une chose simple accessible en tant qu'arguments par le biais du globbing, donc je m'en tiendrais à cela.

1voto

msw Points 25319

Tu as fait déborder la pile avec une récursion infinie. Pensez à appeler listit / .

Le premier if verra que / est un répertoire, il appellera donc listit / qui appellera ensuite listit / ...

Véase cette réponse pour ce qui se passe ensuite .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X