我在 Windows 10 上不断在命令提示符和 git bash shell 之间切换。假设我在命令提示符(cmd.exe)中将当前目录复制到剪贴板,并想在 git bash 中切换到该目录,我在 .bashrc 文件中编写了一个函数 d2u(),将 Windows 路径转换为 git bash 路径并执行它,效果很好。
anjan@DESKTOP-RPUVCRE MINGW64 /d
$ cat /dev/clipboard
D:\work\playground\reactNative
anjan@DESKTOP-RPUVCRE MINGW64 /d
$ type d2u
d2u is a function
d2u ()
{
cat /dev/clipboard | sed -r "s'\\\\'/'g" | sed -r "s'^D:'/d'g" | sed -r "s'^C:'/c'g"
}
anjan@DESKTOP-RPUVCRE MINGW64 /d
$ pushd `d2u`
/d/work/playground/reactNative /d /d/work/playground/reactNative /d /d/work/playground/reactNative ~
anjan@DESKTOP-RPUVCRE MINGW64 /d/work/playground/reactNative
然而,当我逐步改进它,使用新的函数 cd2u 将其推送到那个 unixy 路径时,它就崩溃了!
anjan@DESKTOP-RPUVCRE MINGW64 /d/work/playground/reactNative
$ type cd2u
cd2u is a function
cd2u ()
{
pushd `cat /dev/clipboard | sed -r "s'\\\\'/'g" | sed -r "s'^D:'/d'g" | sed -r "s'^C:'/c'g" `
}
anjan@DESKTOP-RPUVCRE MINGW64 /d/work/playground/reactNative
$ cd2u
sed: -e expression #1, char 7: unterminated `s' command
/d /d/work/playground/reactNative /d/work/playground/reactNative /d /d/work/playground/reactNative ~
anjan@DESKTOP-RPUVCRE MINGW64 /d
$
发生了什么?为什么我会收到这个错误?
sed: -e expression #1, char 7: unterminated `s' command
我的 sed 版本比较新
$ sed --版本 sed (GNU sed) 4.8
答案1
这是因为反引号 ( ``
) 解释反斜杠。这样,您的\\\\
反引号中的 工作方式与\\
没有反引号一样。然后它们会变成sed
,\
因为双引号也会解释反斜杠。而 tensed
解释\'
为逃脱 '
。
代替反引号使用$()
。此语法不会引入对反斜杠的额外解释级别。$()
无论如何,Nowdays 应该是您的选择。
和引用(提示:双引号$()
不会干扰您在里面的任何引号$()
)。
和不要cat
管。
注意:我既不会检查也不会检查你的sed
表达式。它们可能适合你想要做的事情,也可能是错误的,或者不是最优的。我只是在解释将反引号从函数调用移动到函数主体是如何导致错误的。