在当前目录打开Cygwin的正确姿势

在网上找了一些解决方案,一般都是雷同的方法。对于一些细节并没有兼顾到,比如路径中存在空格的情况,比如根目录与非根目录的路径形式的不同。

改进之后的方案

.bashrc

1
2
3
4
5
6
export _T=${_T//\\//}   # replace backslash to fowardslash
export _T=${_T//\"/} # 如果目录带中文,传入的目录会在首尾加引号,如果无中文则不会加双引号。这里删除首尾双引号,归一处理
if [[ $_T == "" ]]; then
export _T="C:\cygwin64\home\xxx"
fi
cd "$_T"

注册表: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/",相当于在后面追加一个正斜线,也不会影响目录读取