【发布时间】:2022-01-07 06:45:15
【问题描述】:
我正在编写将一些文件移动到远程服务器的脚本(请参阅: Function calls in Here Document for unix shell script 了解更多详情)。为了允许脚本在本地机器和远程服务器上工作,我使用'declare -f' 来包装现有函数以远程执行。到目前为止,我想出了这个:
myscript.sh
REMOTE_HOST=myhost
TMP=eyerep-files
getMoveCommand()
{
echo Src Dir: $2
sudo cp ~/$TMP/start.ini ~/$1/start_b.ini
ls ~/$2
echo Target Dir: $1
ls ~/$1
}
moveRemote()
{
echo "attempting move with here doc"
echo $(declare -fp getMoveCommand )
ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand); getMoveCommand ${1@Q} ${TMP@Q}"
}
moveFiles()
{
case "$1" in
# remote deploy
remote)
moveRemote $2
;;
# local deploy
local)
getMoveCommand $2
;;
*)
echo "Usage: myscript.sh {local|remote}"
exit 1
;;
esac
}
moveFiles $1 $2
exit 0
如果使用 './myscript.sh remote dev' 调用,脚本应该 ssh 进入远程服务器并将文件从一个文件夹移动到另一个文件夹。我遇到的问题是字符串替换。我有一堆全局变量充当 getMoveCommand 需要访问的常量。在此处的示例中,只有一个 (TMP),因此我可以简单地将其作为参数传递。然而,在实际脚本中,正在完成的工作更加复杂,并且需要传入的参数数量会使这个解决方案变得笨拙。由于这些变量永远不会改变,似乎应该可以在将包装函数发送到 ssh 之前强制进行字符串替换。
我想做的事情是否可行,如果可以,怎么办?如果没有,是否有另一种不需要向函数传递大量参数的方法来处理这个问题?
【问题讨论】:
标签: bash function shell unix ssh