【问题标题】:Why is 'cp' failing in this shell script?为什么这个 shell 脚本中的 'cp' 失败了?
【发布时间】:2009-01-05 18:04:16
【问题描述】:

这是我编写的 shell 脚本的 sn-p 代码:

for src in $(find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc)
do
    src=$(basename ${src})
    dest="~/.${src}"
    copy="${src} -> ${dest}"
    cp $src $dest && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
done

由于某种原因,cp 无法执行。例如,在$src='bashrc'的情况下,我得到这个错误:

cp: ~/.bashrc: No such file or directory

不过,我不明白为什么会发生这种情况,因为很明显,~/.bashrc目标,而不是源,所以cp 不应该关心它是否存在。究竟出了什么问题?

【问题讨论】:

  • 考虑使用 'eval' - 如: eval cp "$src" "$dest" ... 这应该确保发生 shell 扩展。

标签: bash shell scripting


【解决方案1】:

尝试使用$HOME 而不是~/ 作为您的主目录。

dest="$HOME/.$src"

此外,如果您的任何文件名中有空格,您可能希望在 $src$dest 变量周围加上引号。

cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"

【讨论】:

    【解决方案2】:

    "~" 出现在这样的双引号中时,不会扩展到您的主目录。请改用"${HOME}/.${src}"。还可以考虑使用另一种在文件名包含空格时有效的方法(哦,我只需要考虑一下我所有的愚蠢的 mp3 文件,其中包含空格!)。而不是做

    for src in $(find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc)
    do
        # ...
    done
    

    喜欢

    find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc | while read src
    do
        # ...
    done
    

    所以通过结合@sirlancelots 和我的空间修复,我们得到:

    find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc | while read src
    do
        src=$(basename "${src}")
        dest="${HOME}/.${src}"
        copy="${src} -> ${dest}"
        cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
    done
    

    【讨论】:

      【解决方案3】:

      你已经逃过了~,所以它不会被扩展,cp也不知道怎么做。

      dest=~/".${src}"
      

      bash 应该这样做。

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 2020-12-14
        • 2021-02-09
        • 1970-01-01
        相关资源
        最近更新 更多