sh脚本:在挂载的文件系统中运行时没有输出

时间:2013-06-29 19:40:25

标签: unix permissions sh

需要一些帮助来理解什么是错的。 简而言之:我编写了一个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;在我的案例中从root运行):

# !/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;

最明显的建议是权限问题。然而一切看起来都很清醒。也许我错过了什么?

1 个答案:

答案 0 :(得分:1)

我不知道你的主要问题是什么(权限或其他东西 - 你应该包括一个如何运行脚本以及如何使用安装和一切准备它的例子)。但是这个脚本可以清理干净。

首先,如果要测试某些内容是否是某个目录,请使用

if [ -d "$something ]

这将摆脱笨拙的file用法。

其次,不要执行将$TARGETS数组转换为一系列行,然后使用循环读取行的冗余步骤。只需直接遍历数组。

for line in $TARGETS

此外,我没有使用ls来填充文件名数组,而是使用了一个glob。但是,我使用find而不是其中任何一个,因此它可以处理递归并通过对同一脚本的调用进行递归来消除您正在创建的进程树。而不是写一个符号链接树制作者脚本,我会使用像lndir这样的东西已经存在...