如何调用从一个Cygwin的BAT / CMD文件,并继承变量?

问题描述 投票:2回答:2

假设我有一个bat(或cmd)脚本,设置环境变量:

rem set_foo.bat
SET foo=XXX

我想打电话给该脚本从Cygwin的bash脚本,以这样的方式,通过set_foo.bat设定的变量是可见的Cygwin的bash脚本。也就是说,这个Cygwin的bash脚本:

#!/bin/sh
<call set_foo.bat in such a way that FOO becomes visible to this Cygwin script>
echo FOO is ${FOO}

应打印:

FOO is XXX

这是可能的,如何?

PS 1:我知道这里提出的解决方案:cygwin environment variables set in bat file,他们是不是我想要的。

PS 2:蝙蝠脚本不是我的控制(在Cygwin bash脚本是)下,使涉及调整球棒脚本的任何解决方案是不能接受的。

PS 3:如果我刚从这样Cygwin的bash脚本调用set_foo.bat

#!/bin/sh
set_foo.bat
echo FOO is ${FOO}

然后FOO的价值是不可见的。也就是说,在Cygwin bash脚本打印:

FOO is 
bash batch-file cmd cygwin
2个回答
2
投票

尝试这个:

#!/bin/sh

export $(cmd /c "set_foo.bat & set foo" | grep "^foo=")
echo Foo is $foo

只要set_foo.bat不设置%foo%范围内setlocal的值,该值应结转到& set foo解释的命令的cmd.exe一半。这将输出变量=值对,这export将解释作为本机变量赋值。


0
投票

下面是一个简单的工作示例。做一个cygwin shell脚本(与LF的EOL)

:
# runner.sh
cmd=/cygdrive/c/Windows/system32/cmd.exe
$cmd /C wrapper.bat
diff env0.txt env1.txt | dos2unix | sed -e '/[0-9]/d' -e '/^> /s/> //'

和一个cmd脚本(与EOL CR / LF)

@rem wrapper.bat
@set > env0.txt
@call .\set_foo.bat
@set > env1.txt

和替身原始CMD文件(也与EOL CR / LF)

@rem set_foo.bat
@set FOO=BAZ

从shell执行./runner.sh将显示由set_foo.bat CMD文件中设置环境变量。只要该文件不使用setlocal命令,你会看到所有wrapper.bat环境的变化。这应该可以正常显示新的环境变量。处理删除或修改被留下作为读者的锻炼; Tibial,同样传递参数。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.