bash - 将现有文件复制到现有目录:没有这样的文件或目录

时间:2016-02-01 19:42:44

标签: linux bash shell

我忙于服务器备份脚本,但复制存在一些问题。

要复制的文件,即src

$ ls -la /home/user/.ssh/authorized_keys 
-rw-r--r-- 1 root root 739 Nov  2 14:19 /home/user/.ssh/authorized_keys

目标目录,即backupdir

$ ls -la /home/user/backup
total 8
drwxrwxr-x  2 user user 4096 Feb  1 21:30 .
drwxr-xr-x 48 user user 4096 Feb  1 21:17 ..

p="-r"
verbose=true

if $verbose; then
    echo -e "cp $p ${src} ${backupdir}"
    $("cp $p ${src} ${backupdir}")
else
    echo -e "cp $p ${src} ${backupdir}"
    $("cp $p ${src} ${backupdir}") > /dev/null
fi

输出:

cp  -r /home/user/.ssh/authorized_keys /home/user/backup/
./backup: line 65: cp -r /home/user/.ssh/authorized_keys /home/user/backup/: No such file or directory

命令输出正确,命令执行正确,命令运行有问题,如所指定的,所有源和目标参数都存在,所有复制参数都存在。

我的结论是cp在使用bash / bash-scripts

时存在问题

(使用sudo运行时没有改变任何东西)

1 个答案:

答案 0 :(得分:3)

引号和命令替换都是非常错误的。引号意味着你希望shell找到一个带有空格的荒谬长名称的可执行文件,并且命令substitute $(...)表示要获取此(不存在)命令的输出并运行 >作为一个命令。

你只想

if $verbose; then
    echo -e "cp $p ${src} ${backupdir}"
fi
cp $p "${src}" "${backupdir}"

echo命令也没用;如果要查看shell正在执行的操作,请使用set -x。 (如果echo为假,我猜你想要跳过$verboseif内没有两个相同的条款......?)if可以简化为$verbose && echo ...