我遇到了bash的引用规则问题,我不知道如何解决这个问题。 我想在某种configuration文件中有一个variables,其中可以指定命令行选项列表。 在我的情况下是rsync:rsync有命令行选项'–rsh',它允许你指定它在另一端使用的遥控器。 例如:
rsync -v --rsh="ssh -p4711 -lhttp" /tmp/testfile remoteMachine.x:/tmp/testfile
这完美的作品! 但是,如果您尝试在脚本中执行此操作,您希望允许在variables中指定所有选项,如下所示:
#!/bin/bash OPTS="-v --rsh=\"ssh -p4711 -lhttp\"" rsync $OPTS testfile remoteMachine.x:/tmp/testfile
在执行此脚本时,将会失败并显示以下错误:
rsync: -p4711: unknown option
这是,因为bash正在做一些讨厌的引用/转义,我不明白为什么(你可以看到什么bash使用'bash -x'):
+ OPTS='-v --rsh="ssh -p4711 -lhttp"' + rsync -v '--rsh="ssh' -p4711 '-lhttp"' testfile remoteMachine.x:/tmp/testfile
我尝试了弱和强引号(“,”)的多种组合,但没有任何作品…你能帮我,为什么bash是这样做的,我怎么能解决这个奇怪的行为?
来自科隆的感谢和问候!
使用数组:
OPTS=(-v --rsh="ssh -p4711 -lhttp") rsync "${OPTS[@]}" testfile remoteMachine.x:/tmp/testfile
有两种选择:通过RSYNC_RSH
环境变量传递--rsh
选项,或直接使用--port
和login@host:path
语法将端口和登录选项传递给rsync