我正在开发一个开源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
....
这样,在制作跨平台应用程序时,处理起来会更少。值不是在开发另一个应用程序时运行哪个脚本的特殊情况
有没有办法在不安装外部依赖项的情况下实现这一目标?
答案 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,让其余的脚本 运行正常。这不是一个完整的解决方案,但可能是一个问题 启动。
答案 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来模拟系统上的值,我将推动它。