递归遍历目录时,我在 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/