script-file vs命令行:rsync和--exclude

Chr*_*ris 8 bash rsync

我有一个简单的测试bash脚本,看起来像这样:

#!/bin/bash

cmd="rsync -rv --exclude '*~' ./dir ./new"
$cmd # execute command
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,它也会复制以a结尾的文件,~即使我想要排除它们.当我直接从命令行运行相同的rsync命令时,它可以工作!有人知道为什么以及如何使bash脚本工作?

顺便说一句,我知道我也可以合作,--exclude-from但我想知道它是如何工作的.

Pau*_*ce. 6

试试eval:

#!/bin/bash

cmd="rsync -rv --exclude '*~' ./dir ./new"
eval $cmd # execute command
Run Code Online (Sandbox Code Playgroud)


Gor*_*son 5

问题不在于您在脚本中运行它,而是您将命令放在变量中,然后运行扩展变量。而且由于变量扩展是在引号删除完成之后发生的,所以您的排除模式周围的单引号永远不会被删除...因此rsync结束了排除名称以'开头并以〜'结尾的文件。要解决此问题,只需删除模式周围的引号(整个内容已经用双引号引起了,因此不需要它们):

#!/bin/bash

cmd="rsync -rv --exclude *~ ./dir ./new"
$cmd # execute command
Run Code Online (Sandbox Code Playgroud)

...说到哪,为什么要在运行命令之前将命令放在变量中?通常,这是使代码比所需的更加混乱的好方法,并触发解析奇数(比这更奇怪)。那么如何:

#!/bin/bash

rsync -rv --exclude '*~' ./dir ./new
Run Code Online (Sandbox Code Playgroud)