如果从 Cygwin 调用 powershell 脚本,为什么它的行为会有所不同?
Why would a powershell script behave differently if it was called from Cygwin?
我
我通常 运行 powershell 来自 cygwin 的脚本是这样的:
$ powershell ./scriptname.ps1
它通常运行良好,但今天我发现一个实例,脚本从 Cygwin 调用时失败,但从 power 调用时成功shell。我有一个非常相似的脚本,在这两种情况下都成功了。
此脚本有两种作用:
buildOpenSSL32.ps1
param ([string]$prefix = $(Resolve-Path .))
$adjPrefix = $prefix -replace "\", "/"
$prefix32 = "${adjPrefix}/win32"
New-Item -ErrorAction Ignore -ItemType directory -Path $prefix32
pushd ${prefix32}/openssl-1.0.2j
write-host "Building OpenSSL for x86 into $prefix32 ..."
write-host "Configuring..."
perl Configure debug-VC-WIN32 --prefix=$prefix32
ms\do_nasm
write-host "Building..."
cmd /c "`"${env:VS140COMNTOOLS}vsvars32.bat`" && nmake /f ms\nt.mak && nmake /f ms\nt.mak install"
popd
write-host "...Done building OpenSSL for x86"
此脚本在直接从 powershell 调用时有效,但从 Cygwin 调用时失败:
buildOpenSSL64.ps1
param ([string]$prefix = $(Resolve-Path .))
$adjPrefix = $prefix -replace "\", "/"
$prefix64 = "${adjPrefix}/win64"
New-Item -ErrorAction Ignore -ItemType directory -Path $prefix64
pushd ${prefix64}/openssl-1.0.2j
write-host "Building OpenSSL for x64 into $prefix64 ..."
write-host "Configuring..."
perl Configure debug-VC-WIN64A --prefix=$prefix64
ms\do_win64a
write-host "Building..."
cmd /c "`"${env:VS140COMNTOOLS}../../VC/vcvarsall.bat`" amd64 && nmake /f ms\nt.mak && nmake /f ms\nt.mak install"
popd
write-host "...Done building OpenSSL for x64"
错误如下所示:
C:\cygwin64\home\mrixman\OpenSSL5\win64\openssl-1.0.2j>perl ms\uplink-x86_64.pl nasm 1>ms\uptable.asm
Can't open perl script "ms../crypto/perlasm/x86_64-xlate.pl": No such file or directory
他们为什么要关心脚本调用的处理方式?
编辑:
根据错误出现的位置,上述脚本中的相关差异似乎是 ms\do_nasm
与 ms\do_win64a
do_nasm.bat(cygwin 友好)
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl nasm VC-WIN32 >ms\nt.mak
perl util\mk1mf.pl dll nasm VC-WIN32 >ms\ntdll.mak
perl util\mk1mf.pl nasm BC-NT >ms\bcb.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
do_win64a.bat(祖父母shell是cygwin时出错)
perl util\mkfiles.pl >MINFO
cmd /c "nasm -f win64 -v" >NUL 2>&1
if %errorlevel% neq 0 goto ml64
perl ms\uplink-x86_64.pl nasm > ms\uptable.asm # <-- This line
nasm -f win64 -o ms\uptable.obj ms\uptable.asm
goto proceed
:ml64
perl ms\uplink-x86_64.pl masm > ms\uptable.asm
ml64 -c -Foms\uptable.obj ms\uptable.asm
:proceed
perl util\mk1mf.pl VC-WIN64A >ms\nt.mak
perl util\mk1mf.pl dll VC-WIN64A >ms\ntdll.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
编辑 2:
我创建了一个调用 Get-ChildItem Env:
的脚本,因此我们可以看看 powershell 环境在从 Cygwin(已损坏)调用时与在 [=63= 时的外观有何不同] 从我的开始菜单(工作)。我将所有内容都转换为小写,这样区分大小写的不匹配就不会造成问题。
对于任何偶然发现此问题的人 post 寻找答案。您很可能在 ActivePerl 之前的路径上同时安装了 cygwin(或类似的)perl。
已经研究了一段时间,当我发现这个 comment 和之前关于 openssl 错误跟踪器上版本输出的两条评论时,我才认为它是 perl 的冲突版本。希望这可以为其他人节省一些时间。
我 我通常 运行 powershell 来自 cygwin 的脚本是这样的:
$ powershell ./scriptname.ps1
它通常运行良好,但今天我发现一个实例,脚本从 Cygwin 调用时失败,但从 power 调用时成功shell。我有一个非常相似的脚本,在这两种情况下都成功了。
此脚本有两种作用:
buildOpenSSL32.ps1
param ([string]$prefix = $(Resolve-Path .))
$adjPrefix = $prefix -replace "\", "/"
$prefix32 = "${adjPrefix}/win32"
New-Item -ErrorAction Ignore -ItemType directory -Path $prefix32
pushd ${prefix32}/openssl-1.0.2j
write-host "Building OpenSSL for x86 into $prefix32 ..."
write-host "Configuring..."
perl Configure debug-VC-WIN32 --prefix=$prefix32
ms\do_nasm
write-host "Building..."
cmd /c "`"${env:VS140COMNTOOLS}vsvars32.bat`" && nmake /f ms\nt.mak && nmake /f ms\nt.mak install"
popd
write-host "...Done building OpenSSL for x86"
此脚本在直接从 powershell 调用时有效,但从 Cygwin 调用时失败:
buildOpenSSL64.ps1
param ([string]$prefix = $(Resolve-Path .))
$adjPrefix = $prefix -replace "\", "/"
$prefix64 = "${adjPrefix}/win64"
New-Item -ErrorAction Ignore -ItemType directory -Path $prefix64
pushd ${prefix64}/openssl-1.0.2j
write-host "Building OpenSSL for x64 into $prefix64 ..."
write-host "Configuring..."
perl Configure debug-VC-WIN64A --prefix=$prefix64
ms\do_win64a
write-host "Building..."
cmd /c "`"${env:VS140COMNTOOLS}../../VC/vcvarsall.bat`" amd64 && nmake /f ms\nt.mak && nmake /f ms\nt.mak install"
popd
write-host "...Done building OpenSSL for x64"
错误如下所示:
C:\cygwin64\home\mrixman\OpenSSL5\win64\openssl-1.0.2j>perl ms\uplink-x86_64.pl nasm 1>ms\uptable.asm
Can't open perl script "ms../crypto/perlasm/x86_64-xlate.pl": No such file or directory
他们为什么要关心脚本调用的处理方式?
编辑:
根据错误出现的位置,上述脚本中的相关差异似乎是 ms\do_nasm
与 ms\do_win64a
do_nasm.bat(cygwin 友好)
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl nasm VC-WIN32 >ms\nt.mak
perl util\mk1mf.pl dll nasm VC-WIN32 >ms\ntdll.mak
perl util\mk1mf.pl nasm BC-NT >ms\bcb.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
do_win64a.bat(祖父母shell是cygwin时出错)
perl util\mkfiles.pl >MINFO
cmd /c "nasm -f win64 -v" >NUL 2>&1
if %errorlevel% neq 0 goto ml64
perl ms\uplink-x86_64.pl nasm > ms\uptable.asm # <-- This line
nasm -f win64 -o ms\uptable.obj ms\uptable.asm
goto proceed
:ml64
perl ms\uplink-x86_64.pl masm > ms\uptable.asm
ml64 -c -Foms\uptable.obj ms\uptable.asm
:proceed
perl util\mk1mf.pl VC-WIN64A >ms\nt.mak
perl util\mk1mf.pl dll VC-WIN64A >ms\ntdll.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
编辑 2:
我创建了一个调用 Get-ChildItem Env:
的脚本,因此我们可以看看 powershell 环境在从 Cygwin(已损坏)调用时与在 [=63= 时的外观有何不同] 从我的开始菜单(工作)。我将所有内容都转换为小写,这样区分大小写的不匹配就不会造成问题。
对于任何偶然发现此问题的人 post 寻找答案。您很可能在 ActivePerl 之前的路径上同时安装了 cygwin(或类似的)perl。
已经研究了一段时间,当我发现这个 comment 和之前关于 openssl 错误跟踪器上版本输出的两条评论时,我才认为它是 perl 的冲突版本。希望这可以为其他人节省一些时间。