【问题标题】:Copy file in bash script在 bash 脚本中复制文件
【发布时间】:2014-07-26 03:43:02
【问题描述】:

我有一个 bash 脚本,它查看文件夹并将文件从一个文件夹复制到另一个文件夹。 脚本足够大,但这里只有两行:

echo cp $working_directory/$folder_name/$f $new_filename
# cp $working_directory/$folder_name/$f $new_filename

这里是 echo 命令的输出:

cp ~/MEGAsync/development/experiments/bash_renamer/tres/a.pdf ~/MEGAsync/development/experiments/bash_renamer/tres_1.pdf
cp ~/MEGAsync/development/experiments/bash_renamer/tres/b.pdf ~/MEGAsync/development/experiments/bash_renamer/tres_2.pdf

我可以启动任何此命令,并且它在终端中运行良好。
但是如果我取消注释真正的复制命令并启动脚本我会得到错误:

cp ~/MEGAsync/development/experiments/bash_renamer/tres/a.pdf ~/MEGAsync/development/experiments/bash_renamer/tres_1.pdf
cp: ~/MEGAsync/development/experiments/bash_renamer/tres/a.pdf: No such file or directory
cp ~/MEGAsync/development/experiments/bash_renamer/tres/b.pdf ~/MEGAsync/development/experiments/bash_renamer/tres_2.pdf
cp: ~/MEGAsync/development/experiments/bash_renamer/tres/b.pdf: No such file or directory

为什么会出现这个错误,我该如何解决?

【问题讨论】:

  • 尝试用"$HOME"替换~
  • 在这种情况下一切正常。但为什么它不适用于 '~' ?
  • 很可能是因为您引用了~,并且波浪号扩展不会出现在引号中。如果你做了working_directory=~/ 或只是~/$folder_name/$f 它应该可以工作。此外,与问题无关,但您确实应该引用您的变量以防止将来出现分词问题。
  • bash 解释 ~ 符号的方式。在我经常使用它的 c shell 中应该可以正常工作。

标签: bash


【解决方案1】:

我认为问题出在~ 符号上。如果 echo 按原样打印,则意味着它在工作目录中查找名称为 ~ 的目录。您可以将~ 替换为$HOME 或尝试以其他方式执行命令。

【讨论】:

    【解决方案2】:

    这不起作用,因为很可能在您的 $working_directory 变量定义中引用了波浪号 ~,因此 bash 中的 波浪号扩展 不起作用。

    Tilde Expansion

    如果一个单词以 不带引号的波浪号 字符 (‘~’) 开头,则所有 直到第一个不带引号的斜杠的字符(或所有字符,如果有 不是不带引号的斜杠)被视为波浪号前缀。如果没有 波浪号前缀中的字符被引用, 波浪号后面的波浪号前缀被视为可能的登录名。

    ~ 
    The value of $HOME
    
    ~/foo 
    $HOME/foo
    

    【讨论】:

      【解决方案3】:

      看起来作为变量一部分的波浪号~ 没有被扩展。 也许先尝试这样做?:

      eval working_directory=$working_directory
      

      【讨论】:

      • 养成使用evil 的习惯,尤其是当存在同样简单的解决方案时,可能会在未来造成安全漏洞。
      • 我猜错字是故意的?
      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 2013-07-24
      • 2021-10-20
      • 2021-12-08
      • 1970-01-01
      • 2014-04-15
      • 2017-11-27
      • 2019-08-13
      相关资源
      最近更新 更多