Я со вчерашнего дня пытаюсь перевести файл .летучая мышь в бить, но безуспешно, потому что недостаточно знаю тонкости каждой команды, особенно команды Windows call
.
@echo off
echo Installing/updating bot dependencies
call npm ci --only=production --loglevel=warn >NUL
if NOT ["%errorlevel%"]==["0"] (
pause
exit /b %errorlevel%
)
echo Starting the bot
call npm run start
if NOT ["%errorlevel%"]==["0"] (
pause
exit /b %errorlevel%
)
call
— это cmd
внутренняя команда для вызова пакетного файла из пакетного файла. Интерпретаторы оболочки Linux не имеют такой команды. Таким образом, в .sh
файле call
нужно просто удалить его для запуска npm
, который, я думаю, является исполняемым файлом в Linux, а не файлом сценария, как в Windows.
>NUL
кодируется в сценариях оболочки Linux с помощью >/dev/null
. В оболочке нет команды pause
ждать нажатия клавиши. В файл .sh
можно добавить функцию, запрашивающую у пользователя нажатие клавиши, хотя на самом деле это не имеет смысла, поскольку сценарии оболочки Linux обычно выполняются из терминала или приложения, которое фиксирует стандартный вывод и вывод ошибок и отображает оба в графическом окне.
Сценарий оболочки может состоять всего из пяти строк: 1. #!/bin/bash
(шебанг, чтобы интерпретировать файл сценария с bash
в каталоге /bin/
при его прямом запуске и атрибуте исполняемого файла, установленном в .sh
файле), 2. echo "Installing/updating bot dependencies"
3. npm ci --only=production --loglevel=warn >/dev/null || exit
, 4. echo Starting the bot
, 5 npm run start || exit
. Шебанг также может быть просто #!/bin/sh
для интерпретации сценария с помощью любого интерпретатора сценариев, установленного по умолчанию на ПК с Linux.
PS: ни команда pause
, ни команда exit
не изменяют текущий код выхода, как описано в Какие внутренние команды cmd.exe очищают ERRORLEVEL до 0 в случае успеха?. Таким образом, код выхода npm.cmd
соответственно последней команды/исполняемого файла, выполненного этим пакетным файлом, возвращается родительскому процессу с помощью cmd.exe
при использовании только pause & exit /B
в качестве обоих команды, чтобы не изменять код выхода, назначенный в настоящее время динамической переменной ERRORLEVEL
.
Вот перевод:
#!/bin/bash
echo "Installing/updating bot dependencies"
npm ci --only=production --loglevel=warn >/dev/null
exit_code=$?
if [ ${exit_code} -ne 0 ]; then
read -p "Press ENTER to exit."
exit ${exit_code}
fi
echo Starting the bot
npm run start
exit_code=$?
if [ ${exit_code} -ne 0 ]; then
read -p "Press ENTER to exit."
exit ${exit_code}
fi
Я бы сначала улучшил пакетный файл, заменив оба условия
if
наif errorlevel 1 pause & exit /B
или используяcall npm.cmd ci --only=production --loglevel=warn >NUL || (pause & exit /B)
иcall npm.cmd run start || (pause & exit /B)
. См. одна строка с несколькими командами с использованием пакетного файла Windows для получения подробной информации об условии и операторе условного выполнения команды||
, который интерпретаторы оболочки Linux также поддерживают с тем же значением, что и командный процессор Windows.&
— это просто;
в сценариях оболочки.