Есть ли способ выполнять команды из файла .cmd в оболочке zsh (Mac/Unix)

Я нахожусь в каталоге файла, который пытаюсь выполнить, и знаю, что использую правильный текст для выполнения файла, который находится в правильном месте. Файл называется «modify-search.cmd», и я выполняю:

./modify-search.cmd

Однако, поскольку zsh распознает только «эхо», другие команды в моем файле «.cmd» не распознаются, и поэтому моя оболочка zsh сообщает «команда не найдена». Вот код из моего файла modify-search.cmd, за вычетом домена/URL пользователя и ключа администратора.

@echo off

rem Set values for your Search service
set url=YOUR_SEARCH_URL
set admin_key=YOUR_ADMIN_KEY

echo -----
echo Updating the skillset...
call curl -X PUT %url%/skillsets/margies-skillset?api-version=2020-06-30 -H "Content-Type: application/json" -H "api-key: %admin_key%" -d @skillset.json

rem wait
timeout /t 2 /nobreak

echo -----
echo Updating the index...
call curl -X PUT %url%/indexes/margies-index?api-version=2020-06-30 -H "Content-Type: application/json" -H "api-key: %admin_key%" -d @index.json

rem wait
timeout /t 2 /nobreak

echo -----
echo Updating the indexer...
call curl -X PUT %url%/indexers/margies-indexer?api-version=2020-06-30 -H "Content-Type: application/json" -H "api-key: %admin_key%" -d @indexer.json

echo -----
echo Resetting the indexer
call curl -X POST %url%/indexers/margies-indexer/reset?api-version=2020-06-30 -H "Content-Type: application/json" -H "Content-Length: 0" -H "api-key: %admin_key%" 

rem wait
timeout /t 5 /nobreak

echo -----
echo Rerunning the indexer
call curl -X POST %url%/indexers/margies-indexer/run?api-version=2020-06-30 -H "Content-Type: application/json" -H "Content-Length: 0" -H "api-key: %admin_key%" 


Вот результат, который я получаю в терминале, когда выполняю команду:

./modify-search.cmd: line 1: @echo: command not found
./modify-search.cmd: line 3: rem: command not found
-----
Updating the skillset...
./modify-search.cmd: line 9: call: command not found
./modify-search.cmd: line 11: rem: command not found
./modify-search.cmd: line 12: timeout: command not found
-----
Updating the index...
./modify-search.cmd: line 16: call: command not found
./modify-search.cmd: line 18: rem: command not found
./modify-search.cmd: line 19: timeout: command not found
-----
Updating the indexer...
./modify-search.cmd: line 23: call: command not found
-----
Resetting the indexer
./modify-search.cmd: line 27: call: command not found
./modify-search.cmd: line 29: rem: command not found
./modify-search.cmd: line 30: timeout: command not found
-----
Rerunning the indexer
./modify-search.cmd: line 34: call: command not found

Для меня это имеет смысл, поскольку echo — это встроенная команда в zsh, поэтому @echo не выполняется, но выполняются текстовые сообщения уведомлений. Как мне выполнить эти другие команды «.cmd»?

Я провожу учебные занятия по Microsoft Azure, поэтому использую Azure CLI и делаю все это с помощью кода Visual Studio. Кроме того, я установил расширение Powershell в свой код Visual Studio и не могу заставить его работать там. После активации Powershell (через zsh) я попытался выполнить:

command ./modify-search.cmd

Эта команда дала мне тот же результат, что и моя исполняемая команда на zsh - операторы «echo» сработали, а каждая другая команда вернула «команда не найдена».

Мой неэффективный обходной путь для выполнения лабораторного упражнения заключался в том, чтобы напрямую подключить мой URL-адрес и ключ администратора к коду «.cmd», где бы мой файл ни содержал:

%url% %admin_key%

и выполнять вызовы непосредственно через мою оболочку zsh (подключенную к моему Azure CLI), которая работала в последний раз, когда я столкнулся с этой проблемой.

Я второй раз сталкиваюсь с этой проблемой, поэтому решил попросить о помощи, чтобы найти более эффективное решение в будущем. Помогите, пожалуйста, кто-нибудь?

Обновлено: Обновление, на этот раз моя работа не сработала! В прошлый раз я выполнял команды Azure CLI и подставлял данные аутентификации для подключения к своей учетной записи между этими назначенными разделами. На этот раз я выполняю операторы POST и PUT, и это работает по-другому. Я получаю следующий результат:

zsh: no matches found: %url%/skillsets/margies-skillset?api-version=2020-06-30

Edit2: Хорошо, я пытаюсь вызвать REST API с помощью VS Code, что некоторые из вас, возможно, заметили по коду modify-search.cmd. Я провожу некоторые исследования, связанные с этим, и это может привести меня к решению. На данный момент у меня есть:

  1. Установил расширение REST Client для моей IDE, VS Code.

  2. создал отдельный файл «.rest» без расширений (чтобы текстовый файл впоследствии мог изменить код на файл «.rest»).

Я попытался отправить запрос, но получаю ошибку getaddrinfo ENOTFOUND echo... прогресс

Этот файл .cmd предназначен специально для Windows. Он выполняется интерпретатором командной строки Windows. Это не сценарий PowerShell, так что это не поможет. Ничто из этого (кроме ECHO) не совместимо с Mac.

Ken White 17.05.2024 03:26

Спасибо, сэр! Это добавляет некоторую ясность тому, что я видел. Я только что понял, что пытаюсь вызвать REST API из своей IDE (VS Code). Извините, только что внес второе редактирование, разъясняющее это. Разумно ли полагать, что команда будет выполнена на сервере Microsoft, куда я отправляю запрос, и, следовательно, эти команды будут работать, если их отправить?

net068 17.05.2024 03:33

Извините, но я не знаю ответа на этот вопрос.

Ken White 17.05.2024 03:40

Опубликованный вами код выглядит как пакетная программа Windows; Я недостаточно владею языком, чтобы понять, будет ли это также допустимо в Powershell, но, поскольку вы пометили вопрос с помощью powershell, вы, вероятно, уже подозреваете, что это так. В этом случае вам может повезти, потому что, похоже, существует реализация powershell для Mac.

user1934428 17.05.2024 10:17

@user1934428 user1934428 спасибо, сэр, да, я действительно ссылался на эту ссылку, чтобы установить Powershell. Спасибо за ваш вклад!

net068 18.05.2024 07:02
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отмечено в комментариях .cmd (или .bat), файлы — это так называемые пакетные файлы, которые используют язык устаревшей оболочки Windows (он же интерпретатор командной строки), cmd.exe.

Таким образом, вы не можете запускать пакетные файлы на Unix-подобных платформах, таких как macOS.

Однако несложно преобразовать командный файл в сценарий оболочки, понятный POSIX-совместимой оболочке zsh:

  • Удалить @echo off

  • Замените rem на #

  • Удалите set из определений переменных, например set url=YOUR_SEARCH_URL.

  • Ссылайтесь на переменные с префиксом $, а не заключайте их в %...%; например, используйте $url вместо %url%

  • Удалите call перед вызовом таких утилит, как curl.

  • Замените timeout /t 5 /nobreak на sleep 5 (и аналогично для других значений секунд).

Сопоставление фундаментальных функций языка оболочки в cmd.exe, POSIX-совместимых оболочках и PowerShell см. в этом ответе.


Как также отмечается в комментариях, кроссплатформенное решение возможно, учитывая, что версия PowerShell на базе .NET (Core), PowerShell (Core) 7, является кроссплатформенной и работает также на Unix-подобных платформах. .

То есть, если вы напишете свой код в PowerShell и поместите его в файл .ps1, он будет работать на всех поддерживаемых платформах (хотя различия между платформами все равно должны учитываться ситуативно, например, не использовать расширения .exe в вызовах утилит в Unix и для конкретных платформ). переменные среды)

Просто гнида, я бы назвал cmd «оболочкой», просто чтобы быть единообразным в языке, какой инструмент похож на zsh, powershell и т. д.

Maximilian Burszley 17.05.2024 14:48

@mklement0, как всегда совершенно правильный ответ. Я бы рекомендовал ФП игнорировать все, кроме последних двух (2) абзацев. Напишите код один раз в PowerShell и запустите его на всех поддерживаемых платформах. Создание YAMS (Еще один сценарий-мутант) умножает как работу, так и усилия по обслуживанию.

lit 17.05.2024 20:55

Согласен, @lit, по крайней мере, в долгосрочной перспективе (изучение PowerShell — нетривиальная задача, хотя, как мы оба знаем, в конечном итоге оно того стоит); спасибо за приятный отзыв.

mklement0 17.05.2024 21:04

Я просмотрел ответ, на который вы (mklement0) меня направили, и теперь мой скрипт работает! Я столкнулся с новыми проблемами, не связанными с публикацией (это мой момент «добро пожаловать в мир обучения программированию»), но сценарий работает, потому что я получаю новое сообщение об ошибке в моей оболочке zsh с надписью «curl: ( 3) URL-адрес отклонен: неправильное имя хоста». это подсказывает мне, что у меня проблемы с IAM с моим API... Я получил ошибку HTTP 403, поэтому я обновил свой ресурс API до разрешений уровня администратора (я знаю, что это неразумно, это временно) и все еще не мог получить URL-адрес для загрузки - теперь я получаю ошибку HTTP 401. Я разберусь с этим! Спасибо!

net068 18.05.2024 06:46

И для ясности я воспользовался вашим мнением о переводе моего пакетного файла в сценарий оболочки и запустил его как файл «.sh». Я действительно ссылался на связанный ответ для сопоставления фундаментального языка оболочки и переписал сценарий в Powershell, используя переменные среды и локальные переменные, но я сделал это после того, как мой мозг был поджарен, и я вспомнил, что сценарий больше не проблематичен, но делает мой доступ к сценарию/вызов API с разрешения стал новой проблемой. Как я уже сказал, ваше решение сработало! Я только что наткнулся на новую проблему, отдельную от исходного заданного вопроса.

net068 18.05.2024 06:53

Другие вопросы по теме