0

何が問題なのかを理解するには、助けが必要です。要するに、ターゲット ディレクトリ内のソース ディレクトリの内容へのリンクを作成する bourne シェル スクリプトを作成しました。ホストシステムでは問題なく動作しましたが、マウントされた fs (chroot とネイティブシステムの両方から) のディレクトリをターゲットにすると、動作せず、出力がまったく提供されません。

詳細: マウントされた fs: ext3, rw

ホストシステム: 3.2.0-48-generic #74-Ubuntu SMP GNU/Linux

質問を絞り込むために、「/usr」を例に挙げました。

ホストシステムの「/usr」のパーミッション: drwxr-xr-x

マウントされたパーティションの「/usr」のパーミッション: drwxr-xr-x

ホストシステムからbashとdashの両方を使用しようとしました。同じ結果 - ネイティブ ファイル システムでは機能しますが、マウントされたファイル システムでは機能しません。

スクリプト (cord.sh; 私の場合はルートから実行):

# !/bin/sh

SRCFOLDER=$2                    # folder with package installation
DESTFOLDER=$3                   # destination folder to install symlinks to ('/' - for base sys; '/usr' - userland)
TARGETS=$(ls $SRCFOLDER)        # targets to handle

SRCFOLDER=${SRCFOLDER%/}        # stripping slashes from the end, if they are present
DESTFOLDER=${DESTFOLDER%/}      #

##
## LINKING
##

if [ "$1" = "-c" ];
    then printf %s "$TARGETS" | while IFS= read -r line
        do
            current_target=$(file $SRCFOLDER/$line)     # had an issue with different output in different systems
            if [ "${current_target% }" = "$SRCFOLDER/$line: directory" ];   # stripping space helped
                then
                    mkdir -v $DESTFOLDER/$line    # if other package created it - it'll fail
                    /usr/local/bin/cord.sh -c $SRCFOLDER/$line $DESTFOLDER/$line                   # RECURSION
            else
                ln -sv $SRCFOLDER/$line $DESTFOLDER/$line   # will fail, if exists
            fi;
        done

##
## REMOVING LINKS
##

elif [ "$1" = "-d" ];
    then printf %s "$TARGETS" | while IFS= read -r line
        do
            current_target=$(file $SRCFOLDER/$line)
            if [ "${current_target% }" = "$SRCFOLDER/$line: directory" ];
                then
                    /usr/local/bin/cord.sh -d $SRCFOLDER/$line $DESTFOLDER/$line                   # RECURSION
            else
                rm -v $DESTFOLDER/$line
            fi;
        done


elif [ "$1" = "-h" ];
    then
        echo "Usage:"
        echo "cord -c /path/to/pkgdir /path/to/linkdir  -   create simlinks for package contents"
        echo "cord -d /path/to/pkgdir /path/to/linkdir  -   delete links for package"
        echo "cord -h                                   -   displays this help note"


else
    echo "Usage:"
    echo "cord -c /path/to/pkgdir /path/to/linkdir  -   create simlinks for package contents"
    echo "cord -d /path/to/pkgdir /path/to/linkdir  -   delete links for package"
    echo "cord -h                                   -   displays this help note"

fi;

提案する最も明白なことは、権限に関する問題でした。それでも、すべてが正気に見えます。多分私は何かを逃しましたか?

4

1 に答える 1

1

あなたの主な問題が何であるかはわかりません(権限またはその他-スクリプトの実行方法と、マウントなどすべてでスクリプトを準備する方法の例を含める必要があります)。ただし、このスクリプトはクリーンアップできます。

まず、何かがディレクトリであるかどうかをテストしたい場合は、

if [ -d "$something ]

これでわずらわしいfile使い方から解放されます。

$TARGETS次に、配列を一連の行に変換してからループで行を読み取るという冗長な手順を実行しないでください。配列を直接ループするだけです。

for line in $TARGETS

また、ファイル名の配列を設定するために使用する代わりにls、グロブを使用します。ただし、これらのいずれかの代わりに、find再帰を処理し、同じスクリプトへの呼び出しで再帰することにより、作成しているプロセスのツリーを削除できるように使用します。そして、symlink-tree-makerスクリプトを書く代わりに、lndirその目的のためにすでに存在するようなものを使用します...

于 2013-06-29T23:30:25.393 に答える