首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转义传递到unix程序的windows路径中的反斜杠

转义传递到unix程序的windows路径中的反斜杠
EN

Stack Overflow用户
提问于 2011-11-01 12:31:59
回答 6查看 25.9K关注 0票数 10

我试图在cygwin中转义反斜杠,但这似乎几乎是不可能的我已经尝试了很多方法,但都不能正常工作。

代码语言:javascript
运行
复制
  echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo
  echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo

更具体地说,我需要获取一个命令来接收bash中的输入,而不会丢失反斜杠字符。每次我试图传递一个参数时,反斜杠总是消失,破坏我的输入。我不知道如何才能告诉它让输入中的反斜杠保持不变。

我试过以下方法,但似乎都不管用

代码语言:javascript
运行
复制
  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而不带引号。其中一个别名在使用引号时有效。

泰德

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-01 14:47:50

请阅读bash(1) (man bash)中标题为引用的部分。

在您的第一个示例中,

代码语言:javascript
运行
复制
echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo

shell解释(然后删除)双引号中的反斜杠,因此第一个echo命令只看到字符串C:UsersTedDocumentsUnixScripts

在您的第二个示例中,

代码语言:javascript
运行
复制
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo

单引号可以正确地保护反斜杠,您可以看到,只运行第一个echo命令,而不使用| xargs echo

在你剩下的所有例子中,

代码语言:javascript
运行
复制
cyg0 C:\Users\Ted\Music\Enigma
cyg1 C:\Users\Ted\Music\Enigma
...

由于参数(C:\Users\Ted\Music\Enigma)未加引号,外壳程序将再次解释并删除命令(cyg0cyg1,...)之前的反斜杠从来没见过他们。还有..。

我希望能够键入C:\Users\Ted\Music\Enigma而不带引号。

对不起,这件事办不到。如果不将反斜杠放在单引号中,shell会将每个反斜杠解释为后面字符的引号字符,然后删除反斜杠。

您有几个选项:

  1. 在命令行中使用单引号来保护反斜杠:

'C:\Users\Ted\Music\Enigma'

  • Quote cyg4将每个反斜杠字符分开,通过将其加倍,例如

改为使用C:\Users\Ted\Music\Enigma

  • Use cyg4正斜杠:

cyg4 C:/Users/Ted/Music/Enigma

选项3可能真的是你最好的解决方案。不幸的是,对于所有Unix shell来说,反斜杠字符只是一个非常特殊的字符,在处理DOS/Windows路径时,这会导致很多引号问题。但是不广为人知的是,DOS/Windows也非常乐意使用正斜杠(/)作为它的路径分隔符。试试看。

备注:在几个cyg*函数中,只有cyg1和cyg4是正确的。其他人使用了错误的引号。cyg1只对一个参数有用,因为它将所有参数连接到一个带引号的字符串中,而cyg4可以接受多个参数并将多个参数传递给cygpath。然而,由于cyg4只传递其引用的参数,因此它不会添加任何值;它与例如

代码语言:javascript
运行
复制
cygpath C:/Users/Ted/Music/Enigma

祝好运。

票数 17
EN

Stack Overflow用户

发布于 2012-10-13 05:19:38

有时,尝试使用所用程序的手册是很有用的:-)。来自man xargs

代码语言:javascript
运行
复制
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.

此选项确实保留了整行内容。尝试:

代码语言:javascript
运行
复制
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs -0 echo

"-0“会帮你做到这一点!

请注意,对于多个参数,必须对参数进行零终止,例如通过find ... -print0grep ... --null

票数 6
EN

Stack Overflow用户

发布于 2011-11-23 16:40:58

从windows资源管理器中读取粘贴到命令行中的路径时,我遇到了类似的问题:

代码语言:javascript
运行
复制
echo "Please enter path (copy n paste from Win-Explorer):"
read -r myWinPath;

"read -r xyz“命令(与arg."-r")不解释粘贴路径中的单个反斜杠。

代码语言:javascript
运行
复制
myNewCygwinPath=`cygpath -a $myWinPath`;
echo $myNewCygwinPath;

维托里奥

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7962485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档