1

我正在开发一个开源跨平台实用程序,其中包含一些用于管理和基于操作系统的变量设置的包装器。这种内务管理在它自己的脚本中,并且在大多数情况下是生成的。

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

本质上,这就是我想要的:

::# 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
....

这样在做跨平台应用的时候就更不用说了。该值不是在开发另一个应用程序时运行哪个脚本的特殊情况

有没有办法在不安装外部依赖项的情况下实现这一点?

4

2 回答 2

2

我在二月份想出了这个

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

这是一种在 Windows 上从 PowerShell 或 Bash 运行 PowerShell 脚本的方法。如果从 PowerShell 运行,您有

${0+: \}

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

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

这是一个 PowerShell 块注释,再次什么都不做,之后的任何代码都将由 PowerShell 运行。现在如果你从 Bash 运行相同的脚本,你会得到

${0+: \} <#}

基本上运行

: '}' '<#'

再次,NOOP,其次是

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

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

例子

于 2014-08-23T04:38:33.060 回答
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 来模板化我将要推送到的系统上的值。

于 2017-06-07T19:15:38.807 回答