【问题标题】:Cannot use this variable in the mv command [duplicate]无法在 mv 命令中使用此变量 [重复]
【发布时间】:2019-01-10 20:45:53
【问题描述】:

我正在尝试使用这个变量

MediaExt="*.{mp4,mkv,avi}"

在这个命令中

mv ${MediaSource}/${MediaExt} ${UploadDir}

但它似乎不起作用。

有人可以帮帮我吗?谢谢!

【问题讨论】:

  • 什么不起作用?您是否移动了错误的文件?你有错误吗?如果你只是做echo ${MediaSource}/${MediaExt} 你会得到什么?
  • 它给了我这个:/home/me/media/downloaded/testevid/*.{mp4,mkv,avi} /home/me/media/upload。但是,它根本不会移动文件。如果我改用mv ${MediaSource}/*.{mp4,mkv,avi} ${UploadDir},它可以工作。这不是灾难性的,因为我可以找到并替换所有内容,但我想了解发生了什么。
  • 那个 glob 真的匹配任何东西吗?如果 glob 表达式不匹配任何文件,它将扩展为自身。
  • "glob" 作为动词意味着将字符串扩展为一组文件名匹配。这就是您的 shell 如何将 /home/me/media/downloaded/testevid/*.{mp4,mkv,avi} 之类的内容转换为一组文件名以传递给目标进程(在本例中为 mv)。如果 globbing 进程不匹配任何文件,而不是返回一个空参数,它会扩展到自身。因此,mv 不会得到一组文件,而是得到一个与任何文件都不匹配的字符串。
  • 变量替换后大括号不展开。

标签: bash shell variables debian


【解决方案1】:

bash 中的一个命令会被解析多次。决定是否应该执行通配(扩展 * 或 *.{mp4,mkv,avi})的过程发生在扩展变量的过程之前。一旦变量被扩展,就有了 globbing 的候选,但是已经做出了不需要 globbing 的决定

如果你把表达式写成这样就可以了:

mv ${MediaSource}/*.{mp4,mkv,avi} ${UploadDir}

您可能会发现一些建议,您可以使用eval请不要!
这个:

eval mv ${MediaSource}/${MediaExt} ${UploadDir}

将按您的预期执行,但如果您不控制变量的值,eval 可能会很危险。例如,如果 UploadDir 可以设置为:

UploadDir="somedirectory; rm -rf ~"

然后eval 会将您的请求作为两个语句执行并删除您的所有文件。

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2020-01-27
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多