2009-11-30 57 views
3

当在递归查看目录时,我在ksh93中遇到了一些问题。在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 

将同时使用了pdksh创建ksh93的

[email protected]:~> 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 

这个输出/ bash将创建这个

[email protected]:~$ 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的行为,因为它应该?

回答

3

我遵循这个想法 - 并有正确的想法,但错误的原因。 pdksh遵循ksh88语义,并且快速谷歌显示当定义函数时ksh88和ksh93之间存在差异。在第三部分(Shell脚本)

This FAQ for ksh93状态:

Q18。函数名和name()有什么区别?

A18。在ksh88中这些都是一样的。 但是,POSIX标准选择 foo()函数和定义的系统 V Release 2语义给他们,所以 没有本地变量,所以 陷阱没有作用域。 ksh93的 保持ksh88语义定义为函数名, 功能和已改变()的名称的语义 以匹配POSIX语义。显然, 函数名更实用。

我没有访问ksh93的外壳,以测试这一点,但其含义是,当你从自身内部调用RDIR函数,变量dir被覆盖掉了。因此,根据上述内容,尝试将函数声明为function rdir以获得具有本地作用域变量的ksh88语义。

1

完美!

function 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 

完成这项工作。谢谢。

相关问题