【问题标题】:strange behavior when using recursion in ksh93在 ksh93 中使用递归时的奇怪行为
【发布时间】:2009-11-30 19:41:54
【问题描述】:

在递归浏览目录时,我在 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 行为正常的开关?

【问题讨论】:

    标签: ksh pdksh


    【解决方案1】:

    我对此进行了思考——我的想法是正确的,但原因却是错误的。 pdksh 遵循 ksh88 语义,快速 google 发现在定义函数时 ksh88 和 ksh93 之间存在差异。

    This FAQ for ksh93 在第三部分(Shell 脚本)中声明:

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

    A18。在 ksh88 中,这些是相同的。 但是,POSIX 标准选择 foo() 用于函数和定义的系统 V Release 2 语义给他们,这样 没有局部变量,所以 陷阱不在范围内。 ksh93 保留 ksh88 语义 定义为函数名的函数, 并更改了 name() 语义 匹配 POSIX 语义。清楚地, 函数名更有用。

    我无权访问 ksh93 shell 来测试它,但这意味着当您从自身内部调用 rdir 函数时,变量 dir 将被覆盖。因此,根据上述情况,尝试将您的函数声明为 function rdir 以获取具有本地范围变量的 ksh88 语义。

    【讨论】:

      【解决方案2】:

      完美!

      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
      

      完成这项工作。谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-11
        • 2016-11-06
        • 2016-11-07
        • 2015-01-31
        • 2017-01-20
        • 2013-07-23
        • 2017-05-23
        • 1970-01-01
        相关资源
        最近更新 更多