无法找到拒绝访问后我的bash脚本退出的原因

时间:2010-09-10 02:43:22

标签: bash permission-denied

我有一部分脚本执行此操作:

  1. 删除目录中的所有内容
  2. 强制同步来自该目录
  3. 将文件从另一个目录复制到所述目录,其中存在一些源控件阻止被覆盖的冲突(这是可以预期的和我想要的)
  4. 在此之前我会:

    ...
    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中,存在权限问题导致它退出。

2 个答案:

答案 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"