Я пытаюсь запустить сценарий оболочки, расположенный на сервере Linux, из Windows. Сценарий оболочки выполняет две функции:
- Выполните команду
sed
для замены текста в файле .sql в том же каталоге. - Запустите файл .sql с
sqlplus
.
Сценарий оболочки:
!/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
в каталог сценария оболочки.- Запустить сценарий с
./myscript.sh
с аргументами.
2) Тот же сценарий оболочки успешно запускается через .cmd вручную
- Создайте сценарий Windows
test.cmd
на моем ПК с Windows. В файле .cmd у меня есть строчка:
plink.exe -ssh userID@Server
После появления окна консоли я повторяю шаги 2–4, и скрипт успешно выполняется.
Что мне не удается, так это автоматизировать весь процесс.
Вот строка в моем файле .cmd, которую я попытался сделать:
plink.exe -ssh userID@Server /myfilepath/myscript.sh %arg1% %arg2%
Я могу видеть аргументы, переданные правильно, используя несколько echo
в сценарии оболочки. Однако сценарию оболочки не удается найти файл .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 не имеет необходимых компонентов для запуска (т.е. устанавливает переменную env, путь и т. Д.)
!/bin/sh^M
в журнале ошибок. Сценарий оболочки обычно содержит вверху shebang, например#! /bin/sh
. Файл сценария оболочки нуждается в интерпретаторе, и shebang сообщает Linux, какой исполняемый файл использовать в качестве интерпретатора для выполнения файла сценария. Этот shebang означает использованиеsh
в каталоге/bin
, который обычно является символической ссылкой на реально используемый исполняемый файл интерпретатора сценария оболочки.^M
представляет собой возврат каретки. Сценарий оболочки Linux не должен содержать возврата каретки. Он должен содержать только перевод строки в конце каждой строки. - person Mofi   schedule 25.07.2019command.txt
в Windows иmyscript.sh
в Linux имеют только переводы строки и отсутствие возврата каретки, т.е. это текстовые файлы UNIX, а не текстовые файлы DOS / Windows. Правильная ли первая строка с. my_env
вcommand.txt
? - person Mofi   schedule 25.07.2019