假设我有一个bat
(或cmd
)脚本来设置环境变量:
rem set_foo.bat
SET foo=XXX
我想从Cygwin bash脚本调用该脚本,以使Cygwin bash脚本可以看到set_foo.bat
设置的变量。也就是说,此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:bat脚本不受我的控制(Cygwin bash脚本受我控制),因此任何涉及调整bat脚本的解决方案都是不可接受的。
PS 3:如果我只是从Cygwin bash脚本中像这样调用set_foo.bat
:
#!/bin/sh
set_foo.bat
echo FOO is ${FOO}
然后FOO
的值不可见。也就是说,Cygwin bash脚本将打印:
FOO is
答案 0 :(得分:2)
尝试一下:
#!/bin/sh
export $(cmd /c "set_foo.bat & set foo" | grep "^foo=")
echo Foo is $foo
只要set_foo.bat
不在%foo%
范围内设置setlocal
的值,该值应保留到{{1 }}解释的命令。这将输出variable = value对,& set foo
将其解释为本地变量分配。
答案 1 :(得分: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脚本(CR / LF用于EOL)
@rem wrapper.bat
@set > env0.txt
@call .\set_foo.bat
@set > env1.txt
和原始cmd文件的替代(也具有CR / LF用于EOL)
@rem set_foo.bat
@set FOO=BAZ
从外壳执行./runner.sh
将显示set_foo.bat
cmd文件设置的环境变量。只要该文件不使用setlocal
命令,您就会在wrapper.bat
中看到所有环境更改。这应该正确显示新的环境变量。处理删除或更改留给读者作为练习,同样传递参数。
HTH