4

我正在学习 Linux 命令,并且正在练习并尝试编写一个基本的 shell 脚本,该脚本列出了子文件夹中的所有文件和文件,例如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不允许递归吗?请帮忙,谢谢!

4

2 回答 2

2

shell当然支持递归。但是您的函数需要参数,并且您将其传递给标准输入。除此之外,你真的不应该解析ls. 考虑一下:

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

listit *

如果你真的想阅读标准输入,你必须重写listit才能做到这一点。这很棘手,因为您只能获得一个标准输入,并且每个递归调用都会尝试拥有它。文件名是一个简单的东西,可以通过 globbing 作为参数访问,所以我会坚持这一点。

于 2013-05-29T16:48:12.917 回答
1

你用无限递归溢出了堆栈。考虑调用listit /.

第一个if会看到这/是一个目录,所以它会调用listit /然后调用listit /...

请参阅此答案以了解接下来会发生什么

于 2013-05-29T16:52:11.517 回答