我试图逃避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会将每个反斜杠解释为后面跟随的字符的引号,然后删除反斜杠.
你有几个选择:
在命令行上使用单引号来保护反斜杠:
cyg4 'C:\Users\Ted\Music\Enigma'
Run Code Online (Sandbox Code Playgroud)通过加倍,例如,分别引用每个反斜杠字符
cyg4 C:\\Users\\Ted\\Music\\Enigma
Run Code Online (Sandbox Code Playgroud)改为使用正斜杠:
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 ... -print0或grep ... --null。
| 归档时间: |
|
| 查看次数: |
20950 次 |
| 最近记录: |