Я навчаюся команді 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 /
...
Побачити це відповідь на те, що відбудеться далі.