3

ディレクトリを再帰的に通過するときに、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 を正常に動作させるスイッチは存在しますか?

4

2 に答える 2

3

私はこれについて考えました - そして正しい考えを持っていましたが、間違った理由を持っていました. pdksh は ksh88 のセマンティクスに従っており、関数が定義されている場合、ksh88 と ksh93 の間に違いがあることが簡単にグーグルでわかります。

この ksh93 に関する FAQは、パート III (シェル スクリプト) で次のように述べています。

Q18. 関数名と名前()の違いは何ですか?

A18. ksh88 では、これらは同じでした。ただし、POSIX 標準では、関数に foo() を選択し、それらに System V Release 2 セマンティクスを定義して、ローカル変数がないようにし、トラップのスコープが設定されないようにします。ksh93 は、関数名として定義された関数の ksh88 セマンティクスを維持し、POSIX セマンティクスに一致するように name() セマンティクスを変更しました。明らかに、関数名の方が便利です。

これをテストするために ksh93 シェルにアクセスすることはできませんが、その意味は、それ自体から rdir 関数を呼び出すと、変数dirが上書きされることです。したがって、上記に基づいて、function rdirローカルにスコープされた変数を使用して ksh88 セマンティクスを取得するように関数を宣言してみてください。

于 2009-11-30T22:26:44.503 に答える
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

仕事をします。ありがとうございました。

于 2009-11-30T22:40:40.680 に答える