转义传递给unix程序的Windows路径中的反斜杠

Fle*_*seo 7 bash cygwin

我试图逃避cygwin中的反斜杠,但似乎我几乎不可能尝试了很多东西,但没有一个正常工作..

  echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo
  echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo
Run Code Online (Sandbox Code Playgroud)

更具体地说,我需要获得一个命令来接收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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我希望能够在没有引号的情况下输入C:\ Users\Ted\Music\Enigma.其中一个别名在使用引号时有效.

摊晒

And*_*man 12

请阅读bash(1)(man bash)中标题为QUOTING的部分.

在你的第一个例子中,

echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo
Run Code Online (Sandbox Code Playgroud)

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

在你的第二个例子中,

echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo
Run Code Online (Sandbox Code Playgroud)

单引号正确保护反斜杠,正如你可以通过运行第一个echo命令看到的那样,没有| xargs echo.

在你剩下的所有例子中,

cyg0 C:\Users\Ted\Music\Enigma
cyg1 C:\Users\Ted\Music\Enigma
...
Run Code Online (Sandbox Code Playgroud)

由于参数(C:\Users\Ted\Music\Enigma)是不带引号的,再次shell解释和命令(前删除反斜杠cyg0,cyg1...)曾经看到他们.和...

我希望能够在没有引号的情况下键入C:\ Users\Ted\Music\Enigma.

对不起,无法完成.如果不将反斜杠放在单引号中,shell会将每个反斜杠解释为后面跟随的字符的引号,然后删除反斜杠.

你有几个选择:

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

    cyg4 'C:\Users\Ted\Music\Enigma'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过加倍,例如,分别引用每个反斜杠字符

    cyg4 C:\\Users\\Ted\\Music\\Enigma
    
    Run Code Online (Sandbox Code Playgroud)
  3. 改为使用正斜杠:

    cyg4 C:/Users/Ted/Music/Enigma
    
    Run Code Online (Sandbox Code Playgroud)

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

注意:在你的几个cyg*函数中,只有cyg1和cyg4是正确的.其他人使用不正确的引用.cyg1仅对一个参数有用,因为它将所有参数连接成一个带引号的字符串,而cyg4可以接受并将多个参数传递给cygpath.但是,由于cyg4只传递其引用的参数,因此它不会添加任何值; 它和我的确没有什么不同

cygpath C:/Users/Ted/Music/Enigma
Run Code Online (Sandbox Code Playgroud)

祝好运.


小智 5

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

echo "Please enter path (copy n paste from Win-Explorer):"
read -r myWinPath;
Run Code Online (Sandbox Code Playgroud)

“ read -r xyz”命令(带有参数“ -r”)不解释粘贴路径中的单个反斜杠。

myNewCygwinPath=`cygpath -a $myWinPath`;
echo $myNewCygwinPath;
Run Code Online (Sandbox Code Playgroud)

维托里奥


小智 5

有时,尝试使用过的程序的手册会很有用:-)。来自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.
Run Code Online (Sandbox Code Playgroud)

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

echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs -0 echo
Run Code Online (Sandbox Code Playgroud)

“ -0”为您做到了!

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

  • 在字符串到达​​xargs之前,您的反斜杠将被删除。 (3认同)