简单的跨平台基于操作系统的启动/路由脚本

时间:2014-08-22 12:55:16

标签: bash shell cross-platform polyglot

我正在开发一个开源cross platform utility,其中包含一些基于操作系统的内务管理和变量设置的包装器。这种内务管理属于它自己的脚本,并且在很大程度上是生成的。

为了简单和干燥,我希望有一个简单的启动脚本,它选择另一个脚本来运行基于操作系统。

本质上这就是我想要的:

::# 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 :(得分:2)

我在二月份想出了这个

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

这是一种从PowerShell或Bash运行PowerShell脚本的方法 视窗。如果从PowerShell运行,则

${0+: \}

这基本上是一个奇怪命名的变量0+: \,很可能是空的,所以a NOOP。那你有

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

这是一个PowerShell块注释,再没有做任何事情,然后是任何代码 这将由PowerShell运行。现在,如果您从Bash运行相同的脚本,那么 获得

${0+: \} <#}

基本上运行

: '}' '<#'

再次,NOOP,其次是

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

这将用PowerShell替换Bash shell,让其余的脚本 运行正常。这不是一个完整的解决方案,但可能是一个问题 启动。

Example

答案 1 :(得分:1)

在我的用例中,我只需要在单独的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来模拟系统上的值,我将推动它。