Простой кросс-платформенный скрипт запуска / маршрутизации на основе ОС
Я занимаюсь разработкой кроссплатформенной утилиты с открытым исходным кодом, которая содержит несколько оболочек для ведения домашнего хозяйства и настройки переменных на основе операционной системы. Эта уборка ведется в рамках собственного сценария и, по большей части, генерируется.
Для простоты и СУХОГО, я хотел бы иметь один простой скрипт запуска, который выберет другой скрипт для запуска на основе операционной системы.
По сути это то, что я хотел бы:
::# 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 для шаблонирования значений в системах, к которым я буду подталкивать.