Простой кросс-платформенный скрипт запуска / маршрутизации на основе ОС

Я занимаюсь разработкой кроссплатформенной утилиты с открытым исходным кодом, которая содержит несколько оболочек для ведения домашнего хозяйства и настройки переменных на основе операционной системы. Эта уборка ведется в рамках собственного сценария и, по большей части, генерируется.

Для простоты и СУХОГО, я хотел бы иметь один простой скрипт запуска, который выберет другой скрипт для запуска на основе операционной системы.

По сути это то, что я хотел бы:

::# Somehow run this on osx/windows/linux +++
switch OSTYPE
when "win32"
   windows_script.bat ARGS
when "linux"
   linux_script.sh ARGS
when "darwin"
   darwin_script.sh ARGS
....

Таким образом, было бы еще меньше проблем при создании кроссплатформенных приложений. Значение не в особом случае, какой скрипт запускается при разработке другого приложения

Есть ли способ добиться этого без установки внешних зависимостей?

2 ответа

Я придумал это еще в феврале

${0+: \} <#}
exec powershell $(cygpath -m $(realpath $0)) $*
#>

Это способ запуска сценария PowerShell из PowerShell или Bash в Windows. Если запустить из PowerShell у вас есть

${0+: \}

Который в основном является странно названной переменной 0+: \Скорее всего пустой, так что NOOP. Тогда у вас есть

<#}
exec powershell $(cygpath -m $(realpath $0)) $*
#>

Что является блочным комментарием PowerShell, опять ничего не делает, тогда любой код после этого будет запускаться PowerShell. Теперь, если вы запустите тот же скрипт из Bash, вы получите

${0+: \} <#}

Который по сути работает

: '}' '<#'

Опять NOOP, а затем

exec powershell $(cygpath -m $(realpath $0)) $*

Что заменит оболочку Bash на PowerShell, позволяя остальной части скрипта работать правильно. Это не полное решение вашей проблемы, но может стать началом.

пример

В моем случае я просто нуждался в некоторых похожих переменных в отдельных сценариях powershell и bash. Я изменил ответ Стивена и придумал этот пример:

${0+: \} <#}
#only runs in bash and sets these variables in linux
export foo="foovalue"
export bar="barvalue"
export baz="bazvalue"
#only runs in powershell and sets the same variables#>
${0+: \} <#}
##>; $foo="foovalue"
${0+: \} <#}
##>; $bar="barvalue"
${0+: \} <#}
##>; $baz="bazvalue"

Он читается как машинный код, но я использую terraform для шаблонирования значений в системах, к которым я буду подталкивать.

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