我正在尝试开发一种快速的解决方案,以在Windows和Cygwin之间的文件夹上导航。
在Windows上,路径如下:
C:\Users\foo\my folder\
当我需要进入Cygwin上的同一文件夹时,我需要使用以下格式
/cygdrive/c/Users/foo/my\ folder/
每次使用资源管理器时,我都需要复制链接并进行编辑。
所以我为我的.bashrc
文件制作了一个简单的脚本
它对于包含空格的路径非常有效,但是当我尝试用'\ '
替换空格时,链接找不到目录。
我试图回显路径,将其复制并粘贴到终端上,并且可以正常工作。
但这不起作用:
function cdWinPath(){
if [ `expr index "$1" C:\\` == '1' ]
then
length=`expr length "$1"`
pathSubs=${1:2:$length}
cygPath="/cygdrive/c${pathSubs//\\/\/}"
cygPath="${cygPath// /\\\ }" #piece of code that replaces blank space
echo "cd $cygPath"
cd "$cygPath" # shows 'No such file or directory'
else
echo "Could not understand path $1"
fi
}
答案 0 :(得分:0)
shell会在扩展变量之前解析引号和转义符,因此不会像对待普通字符一样对待变量值中的引号和转义符。因此,不要尝试在变量中嵌入转义符,只需在变量引用周围加上双引号即可。
其他一些建议:不用弄乱expr
,而只需使用shell的内置字符串操作即可。当确实需要捕获其他程序的输出时,请使用$( )
而不是反引号。最后,function
关键字是非标准的,只需在名称后使用()
即可定义函数。像这样:
cdWinPath() {
local cygPath="${1/#[Cc]:\\//}" # Replace 'C:\' or 'C:\' prefix with just '/'
cygPath="${cygPath//\\//}" # Replace any other '\' with '/'
cd "$cygPath"
}
但是,请注意,这要求将Windows路径正确传递给该函数。这意味着路径中 中的反斜杠和/或空格必须正确转义或加引号(这意味着必须对所有变量引用都加双引号)。
cdWinPath 'C:\Users\foo\my folder\' # This works
cdWinPath C:\\Users\\foo\\my\ folder\\ # So does this
cdWinPath C:\Users\foo\my folder\ # This does not work
cdWinPath "$somevar" # This works, provided `somevar` is properly set
cdWinPath $somevar # This does not work
如果您希望它容忍错误地传递的路径,则可以通过将第一行替换为以下内容来使其更具容忍性:
local cygPath="${*/#[Cc]:\\//}"
使用${*...}
而不是$[1...}
会将所有参数传递给函数,并将它们与它们之间的空格混合在一起,并假设它们最初是在空格上分割的一个字符串。这有时会起作用,但并非总是如此。例如,以下命令:
cdWinPath C:\Users\foo\my folder\
...仍然不起作用,因为外壳程序会在函数甚至获取字符串之前将反斜杠解释为转义符,并且没有办法解决。