【发布时间】:2022-01-07 04:53:54
【问题描述】:
我正在编写一个 shell 脚本来移动一些文件。该脚本需要能够根据传入的参数对本地计算机或远程服务器上的文件进行操作。我已经设法组合了一个简单的函数来满足我的需求。我似乎无法弄清楚如何在 Here 文档中使用该功能,以便它可以在远程服务器上执行。我在这里发现了一个类似的问题:From shell script can we invoke function from here document 但给定的答案对我不起作用。
这是我到目前为止的想法:
myscript.sh
REMOTE_HOST=myserver
JETTY_BASE=/opt/web/jetty
doMove()
{
echo "$JETTY_BASE/webapps/eyerep-data/$1"
sudo touch $JETTY_BASE/webapps/eyerep-data/$1/myfile
ls $JETTY_BASE/webapps/eyerep-data/$1;
}
moveRemote()
{
echo "attempting move with here doc"
ssh -t $REMOTE_HOST "/bin/bash <<EOF
$(doMove $1)
EOF"
}
moveFiles()
{
case "$1" in
# remote deploy
remote)
moveRemote $2
;;
# local deploy
local)
doMove $2
;;
*)
echo "Usage: myscript.sh {local|remote}"
exit 1
;;
esac
}
如果我运行上面的
./myscript.sh 远程开发
我得到如下输出:
attempting move with here doc
/bin/bash: line 1: /opt/web/jetty/webapps/eyerep-data/: Is a directory
/bin/bash: line 2: dev: command not found
/bin/bash: line 3: eyerep-data-dev.xml: command not found
/bin/bash: line 4: eyerep-data-local.xml: command not found
/bin/bash: line 5: local: can only be used in a function
查看输出,它似乎试图将来自“echo”和“ls”调用的输出作为命令传递给 /bin/bash,而不是将它们打印到控制台。虽然这是一个人为的例子,但我希望能够在我的函数中包含打印到标准输出的日志语句。处理这个问题的最佳方法是什么?
【问题讨论】:
-
$(doMove $1)在函数体中产生执行命令的结果;它不会为远程 shell 生成这些命令的列表来执行。 -
那么正确的语法是什么?
-
一般来说没有。
doMove是本地定义的,不是远程定义的,所以不能在远程主机上调用。 -
使用说明不是错误消息。您应该发出错误消息并退出 1,或者您应该发出用法语句并退出 0。如果您选择编写错误消息,请将其打印到 stderr。