我有一个简单的测试bash脚本,看起来像这样:
#!/bin/bash
cmd="rsync -rv --exclude '*~' ./dir ./new"
$cmd # execute command
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,它也会复制以a结尾的文件,~即使我想要排除它们.当我直接从命令行运行相同的rsync命令时,它可以工作!有人知道为什么以及如何使bash脚本工作?
顺便说一句,我知道我也可以合作,--exclude-from但我想知道它是如何工作的.
试试eval:
#!/bin/bash
cmd="rsync -rv --exclude '*~' ./dir ./new"
eval $cmd # execute command
Run Code Online (Sandbox Code Playgroud)
问题不在于您在脚本中运行它,而是您将命令放在变量中,然后运行扩展变量。而且由于变量扩展是在引号删除完成之后发生的,所以您的排除模式周围的单引号永远不会被删除...因此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)