【发布时间】:2020-04-01 03:52:25
【问题描述】:
我正在尝试通过 bash 脚本将远程文件夹中的所有内容复制到我的本地计算机:
#!/usr/bin/env bash
REMOTE_SOURCE="/absolute/path/to/source/data"
TARGET="/absolute/local/path/to/target"
SSH="ssh myuser@myhost"
cd $TARGET
echo $PWD
TRANSFER="$SSH -- 'cd $REMOTE_SOURCE; tar cz ./' | tar xz"
echo $TRANSFER
$TRANSFER
运行脚本,传输命令存储在变量中失败:
bash: cd /absolute/path/to/source/data; tar cz ./: 没有这样的文件或目录
虽然从echo $TRANSFER 复制输出并直接运行到 shell 时它可以正常工作:
ssh myuser@myhost -- 'cd /absolute/path/to/source/data; tar cz ./' | tar xz
注意:
- 远程文件夹当然存在,因此报告的错误令人困惑,无法帮助我理解要修复的内容。
- 我收到错误消息,同时删除了
tar cz ./部分并只留下了cd命令。
更新:
删除'-quoting 使命令生效。
但是那么如何将ssh 结果通过管道传输到tar xz?
解决办法:
脚本应尽可能少引用,避免过多的变量扩展魔法:
echo "$SSH -- \"cd $REMOTE_DATA; tar cz ./ \" | tar xz"
$SSH -- "cd $REMOTE_DATA; tar cz ./" | tar xz
【问题讨论】:
-
存储在变量中?将您的脚本添加到您的问题中。
-
脚本已添加。希望现在更清楚了。
-
我知道区别,但我有错误的期望,即放在双引号内,单引号没有任何特殊含义(但可能我应该用 @ 转义它们987654333@) 并且无论如何它都会插入字符串。另外,我现在想知道 何时 会发生插值:分配
TRANSFER变量时还是使用它时?