/ / recursion в сценарії оболонки - linux, bash, shell, recursion

рекурсія в сценарії оболонки - linux, bash, shell, recursion

Я навчаюся команді Linux і практикую і намагаюся написати базовий скрипт оболонки, який перераховує всі файли і файли в підпапках, наприклад ls *, використовуючи рекурсію.

#!/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

Однак результат показує:

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

Це тому, що shell не дозволяє "рекурсію"?

Відповіді:

2 для відповіді № 1

Оболонка, безумовно, підтримує рекурсію. Але ваша функція приймає аргументи, і ви "пропускаєте його". Крім того, ви дійсно не повинні бути синтаксичний аналіз виходу ls. Розгляньте це:

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

listit *

Якщо ви дійсно хочете прочитати stdin, вам доведеться переписати listit зробити це. Це непросто, оскільки ви отримуєте лише один стандартний вхід, і кожен рекурсивний виклик намагатиметься володіти нею.


2 для відповіді № 2

Ви переповнювали стек нескінченною рекурсією. Розглянемо виклик listit /.

Перший if це побачить / - це каталог, за яким він буде викликати listit / який буде викликати listit / ...

Побачити це відповідь на те, що відбудеться далі.