如何从 Cygwin 调用 bat / cmd 文件并继承变量?
How to call a bat / cmd file from Cygwin and inherit the variables?
假设我有一个设置环境变量的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
试试这个:
#!/bin/sh
export $(cmd /c "set_foo.bat & set foo" | grep "^foo=")
echo Foo is $foo
只要 set_foo.bat
没有在 setlocal
范围内设置 %foo%
的值,该值就应该转移到 & set foo
的一半 cmd.exe
-解释命令。这将输出 variable=value 对,export
将解释为本机变量赋值。
这是一个简单的工作示例。制作一个 cygwin
shell 脚本(EOL 使用 LF)
:
# 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
从 shell 执行 ./runner.sh
将显示由 set_foo.bat
cmd 文件设置的环境变量。只要该文件不使用 setlocal
命令,您就会在 wrapper.bat
中看到所有环境变化。这应该正确显示新的环境变量。处理删除或更改留作 reader 的练习,同样传递参数。
HTH
假设我有一个设置环境变量的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
试试这个:
#!/bin/sh
export $(cmd /c "set_foo.bat & set foo" | grep "^foo=")
echo Foo is $foo
只要 set_foo.bat
没有在 setlocal
范围内设置 %foo%
的值,该值就应该转移到 & set foo
的一半 cmd.exe
-解释命令。这将输出 variable=value 对,export
将解释为本机变量赋值。
这是一个简单的工作示例。制作一个 cygwin
shell 脚本(EOL 使用 LF)
:
# 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
从 shell 执行 ./runner.sh
将显示由 set_foo.bat
cmd 文件设置的环境变量。只要该文件不使用 setlocal
命令,您就会在 wrapper.bat
中看到所有环境变化。这应该正确显示新的环境变量。处理删除或更改留作 reader 的练习,同样传递参数。
HTH