需要一些帮助来理解什么是错的。 简而言之:我编写了一个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;
最明显的建议是权限问题。然而一切看起来都很清醒。也许我错过了什么?
答案 0 :(得分:1)
我不知道你的主要问题是什么(权限或其他东西 - 你应该包括一个如何运行脚本以及如何使用安装和一切准备它的例子)。但是这个脚本可以清理干净。
首先,如果要测试某些内容是否是某个目录,请使用
if [ -d "$something ]
这将摆脱笨拙的file
用法。
其次,不要执行将$TARGETS
数组转换为一系列行,然后使用循环读取行的冗余步骤。只需直接遍历数组。
for line in $TARGETS
此外,我没有使用ls
来填充文件名数组,而是使用了一个glob。但是,我使用find
而不是其中任何一个,因此它可以处理递归并通过对同一脚本的调用进行递归来消除您正在创建的进程树。而不是写一个符号链接树制作者脚本,我会使用像lndir
这样的东西已经存在...