ksh - 在 ksh93 中使用递归时的奇怪行为

标签 ksh

递归遍历目录时,我在 ksh93 中遇到了一些问题。

创建一些文件和目录。

base=/tmp/nonsens

for i in {1..3}
do
    mkdir -p ${base}/dir${i}
    for j in {1..2}
    do
        mkdir ${base}/dir${i}/dir${j}
        touch ${base}/dir${i}/dir${j}/file${j}
        touch ${base}/dir${i}/file${j}
    done
done

现在使用 ksh93 脚本检查它。

rdir ()
{
    typeset dir=$1

    for file in `ls $dir`
    do
        if [ -d $dir/$file ]
        then
            echo "Directory: $dir/$file"
            rdir $dir/$file
        else
            echo "File     : $dir/$file"
        fi
    done
}   

rdir /tmp/nonsens

将在 ksh93 中创建此输出

cheko@chwiclu1:~> rdir /tmp/nonsens
Directory: /tmp/nonsens/dir1
Directory: /tmp/nonsens/dir1/dir1
File     : /tmp/nonsens/dir1/dir1/file1
File     : /tmp/nonsens/dir1/dir1/dir2
File     : /tmp/nonsens/dir1/dir1/file1
File     : /tmp/nonsens/dir1/dir1/file2
File     : /tmp/nonsens/dir1/dir1/dir2
File     : /tmp/nonsens/dir1/dir1/dir3

在使用 pdksh/bash 时会创建这个

cheko@redcube:~$ rdir /tmp/nonsens
Directory: /tmp/nonsens/dir1
Directory: /tmp/nonsens/dir1/dir1
File     : /tmp/nonsens/dir1/dir1/file1
Directory: /tmp/nonsens/dir1/dir2
File     : /tmp/nonsens/dir1/dir2/file2
File     : /tmp/nonsens/dir1/file1
File     : /tmp/nonsens/dir1/file2
Directory: /tmp/nonsens/dir2
Directory: /tmp/nonsens/dir2/dir1
File     : /tmp/nonsens/dir2/dir1/file1
Directory: /tmp/nonsens/dir2/dir2
File     : /tmp/nonsens/dir2/dir2/file2
File     : /tmp/nonsens/dir2/file1
File     : /tmp/nonsens/dir2/file2
Directory: /tmp/nonsens/dir3
Directory: /tmp/nonsens/dir3/dir1
File     : /tmp/nonsens/dir3/dir1/file1
Directory: /tmp/nonsens/dir3/dir2
File     : /tmp/nonsens/dir3/dir2/file2
File     : /tmp/nonsens/dir3/file1
File     : /tmp/nonsens/dir3/file2

有人知道解决方法吗?或者是否存在使 ksh93 正常运行的开关?

最佳答案

我对此进行了思考 - 有正确的想法但错误的理由。 pdksh 遵循 ksh88 语义,快速 google 显示在定义函数时 ksh88 和 ksh93 之间存在差异。

This FAQ for ksh93第 III 部分(Shell 脚本)中的状态:

Q18. What is the difference between function name and name()?

A18. In ksh88 these were the same. However, the POSIX standard choose foo() for functions and defined System V Release 2 semantics to them so that there are no local variables and so that traps are not scoped. ksh93 keeps the ksh88 semantics for functions defined as function name, and has changed the name() semantics to match the POSIX semantics. Clearly, function name is more useful.

我无法访问 ksh93 shell 来对此进行测试,但这意味着当您从其内部调用 rdir 函数时,变量 dir 将被覆盖。因此,基于上述内容,尝试将您的函数声明为 function rdir 以获得具有局部范围变量的 ksh88 语义。

关于ksh - 在 ksh93 中使用递归时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1821958/

相关文章:

linux - 应用子文件夹中的所有 stash 更改

shell - KSH 检查字符串是否以子字符串开头

linux + ksh + 向下舍入或向上舍入 - float

ksh - stty hupcl ixon ixoff

linux - ksh "."运算符正在执行字符串替换而不是连接