После публикации этой истории я понял, что сочетание Bash и Powershell может быть более мощным. Это потому, что он позволяет мне создавать сценарии, которые работают как в Windows, так и в Linux!
Это позволяет реализовать процессы установки «двойным щелчком» или однострочник, размещенный на GitHub, который можно запускать в любой среде.
Итак, как мы это делаем?
Как и в предыдущей статье, ключ здесь в том, чтобы найти механизмы, которые синтаксически одинаковы в обоих языках, но имеют немного разное поведение, которое позволяет нам направить выполнение в правильном направлении.
Наблюдение №1: условия несовместимы
К сожалению, когда я играл с конструкциями условий, я не нашел версию, работающую на обоих языках.
Синтаксис if достаточно отличается в Bash и Powershell. Например, синтаксис if в bash содержит ключевое слово «then» и заканчивается «fi», тогда как в PowerShell он заключен в фигурные скобки.
Дайте мне знать в комментариях, если вы найдете способ использовать условия для реализации гибридного скрипта.
Наблюдение №2: функции имеют одинаковый синтаксис в Powershell и Bash
Функции, которые не получают аргументов, имеют тот же синтаксис. Мы можем использовать это для вызова функции из обоих интерпретаторов.
Наблюдение № 3: Синтаксис ссылок на переменные одинаков
Это (необязательное) наблюдение позволяет нам писать немного более чистый код. В обоих языках обращение к переменным выполняется с помощью $varname.
Кроме того, мы можем вызвать функцию, где мы собираем ее имя со строками и переменными.
Более того, некоторые переменные в одном языке определяются автоматически, а в другом нет.
Это позволяет нам создать 2 функции, одну для bash и одну для Powershell, с разными именами.
Сценарий
Объединив эти наблюдения, я пришел к следующему решению:
#!/bin/bash function choose { echo "hi from bash" exit } function choosetrue { echo "hi from pwsh" exit } "choose$true" $(&"choose$true")
Запуск в Bash
При запуске в Bash $true ничего не оценивает, поскольку эта переменная не определяется Bash при запуске скрипта.
Строка «choose$true» оценивается как «выбрать», и поэтому вызывается функция «выбрать».
Обратите внимание, что выход требуется для предотвращения перехода к (недопустимому) коду powershell.
Запуск в Powershell
$true определено в Powershell и имеет строковое представление «true».
строка «choose$true» оценивается как «choosetrue», но, поскольку мы запускаем Powershell, эта строка не работает, потому что это просто строка.
Строка после этого оценивает «choosetrue» и вызывает его как функцию.
Заключительные слова
Найдя решение, я поискал в Интернете «гибридный скрипт» и нашел довольно интересные результаты:
- Файлы гибридных скриптов (github.com)
- «linux — Можно ли написать один скрипт, работающий в bash/shell и PowerShell? - Переполнение стека"
Я думаю, что это довольно изящные головоломки, которые помогают вдохновлять и развивать творческий потенциал.
Спасибо!