2009-11-30 72 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 

完成這項工作。謝謝。

相關問題