我正在尝试从 Windows 运行位于 Linux 服务器上的 shell 脚本。 shell 脚本做了两件事:
- 执行
sed
命令以替换同一目录中 .sql 文件中的文本。 - 使用
sqlplus
运行 .sql 文件。
shell脚本:
!/bin/sh
arg1=$1
arg2=$2
arg3=$(echo $arg1 | tr '[:lower:]' '[:upper:]')
arg4=$(echo $arg2 | tr '[:lower:]' '[:upper:]')
echo $arg1
echo $arg2
echo $arg3
echo $arg4
sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql
sqlplus $arg2/$arg2@MYDB <<EOF
@sequence.$arg1.sql
exit;
(我的数据库位于同一台 Linux 服务器上。)
1) 当我通过 MobaXterm 登录服务器时脚本运行正常
- 使用
userID
连接到服务器。 - 设置
my_env
。 cd
到 shell 脚本的目录。- 使用带参数的
./myscript.sh
运行脚本。
2) 相同的shell脚本通过.cmd手动运行成功
- 在我的 Windows PC 上创建一个 Windows 脚本
test.cmd
。 在 .cmd 文件中有一行:
plink.exe -ssh userID@Server
弹出控制台窗口后,我重复步骤 2 到 4,脚本成功运行。
我未能做到的是使整个过程自动化。
这是我尝试的 .cmd 文件中的行:
plink.exe -ssh userID@Server /myfilepath/myscript.sh %arg1% %arg2%
我可以在 shell 脚本中使用多个 echo
看到正确传递的参数。但是,shell 脚本无法找到 .sql 文件。
错误日志:
/mypath/myscript.sh[1]: !/bin/sh^M not found [No such file or directory] myarg1value myarg2value :No such file or directory[myarg1value] /mypath/myscript.sh[12]: sqlplus: not found [No such file or directory]
我也在下面尝试过,但不幸的是结果相同:
plink.exe -ssh userID@Server -m command.txt
文件 command.txt
包含:
. my_env
cd /filepath/
./myscript.sh %arg_with_actual_value%
我不知道为什么它不起作用,尤其是当 2) 起作用并且脚本相对简单时。
我是否对 plink
(路径、变量等)做出了错误的假设?
Cygwin 是唯一的出路吗?
我尽量不依赖另一个工具,因为我一直在使用 plink
。
编辑:虽然行
sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql
无法在 .sh 上运行,我可以通过以下方式在 .cmd 文件本身上运行它:
plink.exe -ssh userID@Server sed -i "s/%arg3%/%arg4%/g" /myfilepath/sequence.%arg1%.sql
因此我怀疑问题出在 .sh 文件没有运行所需的组件(即设置环境变量、路径等)
最佳答案
这不是解决方案,但部分解决了一些问题,感谢 Martin Prikryl 和 Mofi 的输入:
在command.txt中,需要设置如下内容:
ORACLE_SID
ORACLE_HOME
路径
这些都设置好后,sqlplus和sed就可以正常工作了。但是,通过 plink 从 .cmd 向 Linux 的 shell 脚本传递值似乎与传递的实际值有问题。该变量将具有分配的值以及一些不可读的字符。在这种情况下,
sqlplus $arg2/$arg2@MYDB
登录失败,因为 arg2 包含一些其他字符。
@sequence.$arg1.sql
这一行也会失败,因为它会尝试打开 2 个文件,一个名为 sequence.myvalue,另一个名为“%s”,我怀疑分配的变量包含某种不可读的下一行字符。
编辑:已修复,我们可以使用来自 sed 的相同处理 - 直接从 plink 运行 sqlplus 而不是传递值并在 Linux 中运行 .sh 脚本:
sqlplus $arg2/$arg2@MYDB @/myfilepath/sequence.%arg1%.sql
关于linux - 如何从 Windows 环境运行位于 Linux 服务器上的 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57188347/