0

需要一些帮助来了解问题所在。简而言之:我编写了一个 bourne shell 脚本,它在目标目录中创建指向源目录内容的链接。它在主机系统上运行良好,但是当针对挂载 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我不会使用填充文件名数组,而是使用 glob。但不是其中任何一个,我会使用find它来处理递归并通过调用同一脚本进行递归来消除您正在创建的进程树。而不是编写一个符号链接树制造商脚本,我会使用lndir已经存在的类似的东西......

于 2013-06-29T23:30:25.393 回答