【发布时间】:2023-03-09 17:20:01
【问题描述】:
我一直在努力创建一个脚本来将一些文件从本地机器移动到远程服务器。作为该过程的一部分,我有一个可以直接调用或使用“declare -fp”包装并发送到 ssh 命令的函数。到目前为止,我的代码如下所示:
export REMOTE_HOST=myserver
export TMP=eyerep-files
doTest()
{
echo "Test moving files from $TMP with arg $1"
declare -A files=(["abc"]="123" ["xyz"]="789")
echo "Files: ${!files[@]}"
for key in "${!files[@]}"
do
echo "$key => ${files[$key]}"
done
}
moveTest()
{
echo "attempting move with wrapped function"
ssh -t "$REMOTE_HOST" "$(declare -fp doTest|envsubst); doTest ${1@Q}"
}
moveTest $2
如果我用类似的东西运行脚本
./myscript.sh test dev
我得到了输出
attempting move with wrapped function
Test moving files from eyerep-files with arg dev
Files: abc xyz
bash: line 7: => ${files[]}: bad substitution
for 循环的字符串扩展似乎无法正常工作。这是预期的行为吗?如果是这样,是否有另一种方法可以通过数组循环来避免这个问题?
【问题讨论】:
-
你为什么用
envsubst? -
@Fravadona 他正在使用它将函数定义复制到远程机器。
-
你不应该使用
envsubst。它依赖于对代码的重新评估。 -
envsubst正在用空字符串替换$key。 -
只要写一个脚本,复制到远程机器,然后远程执行。
ssh并非旨在做你想做的事。
标签: bash shell unix replace declare