假设我有一个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
尝试这个:
#!/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
将解释作为本机变量赋值。
下面是一个简单的工作示例。做一个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