我有一部分脚本执行此操作:
在此之前我会:
...
cp <source path> <dest path>
echo done copying
...
echo done
输出:
...
Permission Denied:file1
Permission Denied:file2
done copying
...
done
所以,它会做的事情,并完成。 然后,我去做了一些检查,以确保目录退出:
if[ -d sourcepath ]
then
if [ -d destpath ]
then
cp <source path> <dest path>
else
echo problem with dest
exit 1
fi
else
problem with source
exit 1
fi
但是现在脚本只是在最后一个Permission Denies之后退出,之后没有点击任何东西,所以输出是这样的:
输出:
...
Permission Denied:file1
Permission Denied:file2
我对bash规则不太了解,所以我只是想在这里发布这个问题,因为我找不到它。看来,在if中,存在权限问题导致它退出。
答案 0 :(得分:4)
除了在cut'n'paste期间可能引入的语法错误之外,该代码没有任何问题,如以下实验所示:
#!/bin/bash
rm -rf sourcepath destpath
mkdir sourcepath
mkdir destpath
touch sourcepath/xyz
touch destpath/xyz
chmod 000 destpath/xyz
if [ -d sourcepath ]
then
if [ -d destpath ]
then
cp sourcepath/xyz destpath/xyz
else
echo problem with dest
exit 1
fi
else
echo problem with source
exit 1
fi
echo Woohoo!
运行时,输出:
cp: cannot create regular file `destpath/xyz': Permission denied
Woohoo!
所以你可以看到它在失败后继续进行。
一条非常宝贵的建议:当您调试bash
脚本时,请填写以下内容:
set -x
在顶部(#!/bin/bash
之后,如果它在那里)。这将导致它在执行之前输出每个命令。
事实上,我始终以我的脚本开头:
#!/bin/bash
#set -x
所以我可以取消注释第二行以进行调试。
顺便说一句,我会将其编码为:
if [[ ! -d sourcepath ]] ; then
problem with source
exit 1
fi
if [[ ! -d destpath ]] ; then
problem with dest
exit 1
fi
cp <source path> <dest path>
但这只是因为我不喜欢复杂的if-then-else
构造。
答案 1 :(得分:0)
你必须检查写权限
test -w / && echo "writable"
test -w ~ && echo "writable"