在网上找了一些解决方案,一般都是雷同的方法。对于一些细节并没有兼顾到,比如路径中存在空格的情况,比如根目录与非根目录的路径形式的不同。
改进之后的方案
.bashrc
1 | export _T=${_T//\\//} # replace backslash to fowardslash |
注册表:HKEY_CLASSES_ROOT\Directory\Background\shell\open in Cygwin\command
1 | c:\cygwin64\bin\mintty.exe /bin/env _T="%V/" /bin/bash -l |
相关解释
关于export _T=${_T//\"/}
如果目录带中文,传入的目录会在首尾加引号,如果无中文则不会加双引号。这里删除首尾双引号,归一处理。
如果不加处理,在有中文的路径中会提示找不到(带引号的)目录。
关于_T="%V/"
双引号
兼容目录路径有空格的情况
后面的斜杠
为了兼容根目录与非根目录的不同形式。win10中各分区的根目录以反斜杠结尾,非根目录则末尾没有反斜杠。例如在C盘根目录,传入的参数是"C:\"
,这样拼接后成了_T="C:\"
,末尾的引号会被转义成引号,拼接成了错误命令:/bin/env _T=C:" /bin/bash -l
,如图所示。
而非根目录的末尾不会有反斜杠,例如C盘下的子目录cygwin64,传入的参数是"C:\cygwin64"
,拼接之后_T="C:\cygwin64"
,没问题。
为了归一处理,这里在%V
后面加了个正斜杠/
,这样做的效果是:
对于根目录情况,例如"C:\"
拼接成了"C:\/"
,进而被解析成"C:/"
。也就是会在后面的反斜线后面加一个正斜线,将正斜杠转义,破坏对后面引号的转义,同时目录后面加一个正斜线不影响目录读取。
对于非根目录情况,例如"C:\cygwin64"
拼接成了"C:\cygwin64/"
,解析后也是"C:\cygwin64/"
,相当于在后面追加一个正斜线,也不会影响目录读取。