"类型"命令在Git Bash上没有按预期工作

时间:2014-08-21 20:41:24

标签: linux windows windows-8 windows-8.1 git-bash

Linux中的type命令返回给定文件在文件系统上的位置(如果它位于当前文件夹或$PATH中)。使用Git Bash命令行程序在Windows上也可以使用此功能。但是,我遇到了一个奇怪的角落情况,$PATH上的文件存在,但是没有使用该命令返回。

我正在考虑尽快购买一台新电脑,所以我查找了将许可证密钥从一台计算机转移到另一台计算机的方法,为实际做这件事做准备。 The method I found提到了文件slmgr.vbsslui.exe,这两个文件都位于我C:/Windows\System32的{​​{1}}文件夹中,与Windows计算机一样。但是,当我使用$PATH命令时,这两个文件不会显示出来。此外,type在我slmgr.vbs中调用Git Bash时执行,而不是slui.exe。 (slmgr.vbs无法使用Git Bash正确执行 ,但我可以使用cmd中的Git Bash CLI来调用它。)最后,在slmgr.vbs中列出文件夹内容时会显示Git Bash,但slui.exe不是。

我认为这可能与权限有关,事实上,两个文件都具有非常严格的权限,如下图所示,但它们都具有相同的权限,这无法解释为什么在直接调用时执行并且另一个没有执行,也不是为什么一个文件在命令行中列出但另一个文件没有列出。

C:\Windows\System32文件夹,证明文件存在:

enter image description here

两个文件的UsersAdministrators组的文件权限(它们完全相同):

enter image description here

文件夹:

enter image description here

type命令及其在Git Bash中输出的2个文件,并列出文件夹中的文件(使用grep过滤,因为文件夹很大),以及列出$PATH的一部分(请记住,在阅读时,Git Bash会更改显示的路径):

Sean@MYPC ~
$ type -a slmgr.vbs
sh.exe": type: slmgr.vbs: not found

Sean@MYPC ~
$ type -a slui.exe
sh.exe": type: slui.exe: not found

Sean@MYPC ~
$ slmgr.vbs
/c/WINDOWS/system32/slmgr.vbs: line 2: syntax error near unexpected token `('
/c/WINDOWS/system32/slmgr.vbs: line 2: `' Copyright (c) Microsoft Corporation. A
ll rights reserved.'

Sean@MYPC ~
$ slui.exe
sh.exe": slui.exe: command not found

Sean@MYPC ~
$ ls /c/Windows/System32/slui.exe /c/Windows/System32/slmgr.vbs
ls: /c/Windows/System32/slui.exe: No such file or directory
/c/Windows/System32/slmgr.vbs

Sean@MYPC ~
$ echo $PATH
/c/Users/Sean/bin:.:/usr/local/bin:/mingw/bin:/bin:/cmd:/c/Python33/:/c/Program
Files (x86)/Intel/iCLS Client/:/c/Program Files/Intel/iCLS Client/:/c/WINDOWS/sy
stem32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell
/v1.0/:/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/c/Progr
am Files/Intel/Intel(R) Management Engine Components/IPT:/c/Program Files (x86)/
Intel/Intel(R) Management Engine Components/DAL:/c/Program Files (x86)/Intel/Int
el(R) Management Engine Components/IPT:/c/Program Files/Intel/WiFi/bin/:/c/Progr
am Files/Common Files/Intel/WirelessCommon/:/c/strawberry/c/bin:/c/strawberry/pe
rl/site/bin:/c/strawberry/perl/bin:/c/Program Files (x86)/Microsoft ASP.NET/ASP.
NET Web Pages/v1.0/:/c/Program Files/Microsoft SQL Server/110/Tools/Binn/:/c/Pro
gram Files (x86)/Microsoft SQL Server/90/Tools/binn/:/c/Program Files (x86)/Open
AFS/Common:/c/HashiCorp/Vagrant/bin:/c/Program Files (x86)/Windows Kits/8.1/Wind
ows Performance Toolkit/:/c/Program Files/nodejs/:/c/Program Files (x86)/Git/cmd
:/c/Program Files (x86)/Git/bin:/c/Program Files/Microsoft/Web Platform Installe
r/:/c/Ruby200-x64/bin:/c/Users/Sean/AppData/Local/Box/Box Edit/:/c/Program Files
 (x86)/SSH Communications Security/SSH Secure Shell:/c/Users/Sean/Documents/Lisp
:/c/Program Files/GCL-2.6.1/lib/gcl-2.6.1/unixport:/c/Chocolatey/bin:/c/Users/Se
an/AppData/Roaming/npm:/c/wamp/bin/mysql/mysql5.6.12/bin:/c/Program Files/Oracle
/VirtualBox:/c/Program Files/Java/jdk1.7.0_51/bin:/c/Program Files/Node-Growl:/c
/chocolatey/bin:/c/Program Files/eclipse:/c/MongoDB/bin:/c/Program Files/7-Zip:/
c/Program Files (x86)/Google/Chrome/Application:/c/Program Files (x86)/LibreOffi
ce 4/program:/c/Program Files (x86)/OpenOffice 4/program

发生了什么?为什么这些文件不是用type命令列出的?这个问题是因为奇怪的Windows权限,还是更奇怪的东西?如果是权限,为什么它们似乎具有相同的权限,但两者都没有以相同的方式处理?

编辑我尝试了@ RossRidge的答案,将隐形的虚拟C:\Windows\Sysnative文件夹放在我的$PATH中。我的结果如下:

Sean@MYPC ~
$ type -a slmgr.vbs
sh.exe": type: slmgr.vbs: not found

Sean@MYPC ~
$ type -a slui.exe
slui.exe is /c/WINDOWS/Sysnative/slui.exe

Sean@MYPC ~
$ slmgr.vbs
/c/WINDOWS/system32/slmgr.vbs: line 2: syntax error near unexpected token `('
/c/WINDOWS/system32/slmgr.vbs: line 2: `' Copyright (c) Microsoft Corporation. A
ll rights reserved.'

Sean@MYPC ~
$ slui.exe

Sean@MYPC ~
$ ls /c/Windows | grep sysnative

Sean@MYPC ~
$ ls /c/Windows/sysnative | grep pla
AutoWorkplace.exe*
AutoWorkplace.exe.config
AutoWorkplaceN.dll*
DeviceDisplayStatusManager.dll*
Display.dll*
DisplaySwitch.exe*

正如您所看到的,列出Sysnative的内容时未列出/c/Windows(为了简洁而再次进行过滤),但列出/c/Windows/Sysnative的内容有效。执行slmgr.vbsslui.exe而不指定它们的路径也有效(slmgr仍然需要我故意不提供的参数)。然而,真正奇怪的部分是type命令现在将slui.exe列为/c/Windows/Sysnative文件夹,但slmgr.vbs仍未显示。为什么我能够执行它,但仍然没有显示type命令?

1 个答案:

答案 0 :(得分:3)

看起来你已经遇到了WOW64重定向器。您想要的文件位于c:\windows\system32,但由于shell和其他实用程序是32位程序,因此它们会重定向到c:\windows\syswow64。解决问题的简单方法是从普通(64位)Windows命令行运行所需的命令。

如果您确实想从MSYS环境运行这些命令,可以运行命令/c/windows/sysnative/slui或将/c/windows/sysnative添加到路径中。您可能需要使用cscript命令来运行VBScript文件。