我试图在cygwin中转义反斜杠,但这似乎几乎是不可能的我已经尝试了很多方法,但都不能正常工作。
echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo
更具体地说,我需要获取一个命令来接收bash中的输入,而不会丢失反斜杠字符。每次我试图传递一个参数时,反斜杠总是消失,破坏我的输入。我不知道如何才能告诉它让输入中的反斜杠保持不变。
我试过以下方法,但似乎都不管用
alias cyg0='cygpath '$*' '
alias cyg1='cygpath "$*" '
alias cyg2='cygpath "'$*'"'
alias cyg3='cygpath '$@' '
alias cyg4='cygpath "$@" '
alias cyg5='cygpath "'$@'"'
Ted@Machine01 ~
$ cyg0 C:\Users\Ted\Music\Enigma
C:UsersTedMusicEnigma
Ted@Machine01 ~
$ cyg1 C:\Users\Ted\Music\Enigma
cygpath: can't convert empty path
Ted@Machine01 ~
$ cyg2 C:\Users\Ted\Music\Enigma
cygpath: can't convert empty path
Ted@Machine01 ~
$ cyg3 C:\Users\Ted\Music\Enigma
C:UsersTedMusicEnigma
Ted@Machine01 ~
$ cyg4 C:\Users\Ted\Music\Enigma
C:UsersTedMusicEnigma
Ted@Machine01 ~
$ cyg5 C:\Users\Ted\Music\Enigma
cygpath: can't convert empty path
顺便说一下,我希望能够键入C:\Users\Ted\Music\Enigma而不带引号。其中一个别名在使用引号时有效。
泰德
发布于 2011-11-01 14:47:50
请阅读bash(1) (man bash
)中标题为引用的部分。
在您的第一个示例中,
echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo
shell解释(然后删除)双引号中的反斜杠,因此第一个echo
命令只看到字符串C:UsersTedDocumentsUnixScripts
。
在您的第二个示例中,
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo
单引号可以正确地保护反斜杠,您可以看到,只运行第一个echo
命令,而不使用| xargs echo
。
在你剩下的所有例子中,
cyg0 C:\Users\Ted\Music\Enigma
cyg1 C:\Users\Ted\Music\Enigma
...
由于参数(C:\Users\Ted\Music\Enigma
)未加引号,外壳程序将再次解释并删除命令(cyg0
,cyg1
,...)之前的反斜杠从来没见过他们。还有..。
我希望能够键入C:\Users\Ted\Music\Enigma而不带引号。
对不起,这件事办不到。如果不将反斜杠放在单引号中,shell会将每个反斜杠解释为后面字符的引号字符,然后删除反斜杠。
您有几个选项:
'C:\Users\Ted\Music\Enigma'
改为使用C:\Users\Ted\Music\Enigma
cyg4 C:/Users/Ted/Music/Enigma
选项3可能真的是你最好的解决方案。不幸的是,对于所有Unix shell来说,反斜杠字符只是一个非常特殊的字符,在处理DOS/Windows路径时,这会导致很多引号问题。但是不广为人知的是,DOS/Windows也非常乐意使用正斜杠(/
)作为它的路径分隔符。试试看。
备注:在几个cyg*函数中,只有cyg1和cyg4是正确的。其他人使用了错误的引号。cyg1只对一个参数有用,因为它将所有参数连接到一个带引号的字符串中,而cyg4可以接受多个参数并将多个参数传递给cygpath。然而,由于cyg4只传递其引用的参数,因此它不会添加任何值;它与例如
cygpath C:/Users/Ted/Music/Enigma
祝好运。
发布于 2012-10-13 05:19:38
有时,尝试使用所用程序的手册是很有用的:-)。来自man xargs
OPTIONS
-0, --null
Input items are terminated by a null character instead of by
whitespace, and the quotes and backslash are not special (ev-
ery character is taken literally). Disables the end of file
string, which is treated like any other argument. Useful when
input items might contain white space, quote marks, or back-
slashes. The GNU find -print0 option produces input suitable
for this mode.
此选项确实保留了整行内容。尝试:
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs -0 echo
"-0“会帮你做到这一点!
请注意,对于多个参数,必须对参数进行零终止,例如通过find ... -print0
或grep ... --null
。
发布于 2011-11-23 16:40:58
从windows资源管理器中读取粘贴到命令行中的路径时,我遇到了类似的问题:
echo "Please enter path (copy n paste from Win-Explorer):"
read -r myWinPath;
"read -r xyz“命令(与arg."-r")不解释粘贴路径中的单个反斜杠。
myNewCygwinPath=`cygpath -a $myWinPath`;
echo $myNewCygwinPath;
维托里奥
https://stackoverflow.com/questions/7962485
复制相似问题