2011-11-01 84 views
4

我試圖逃避cygwin的反斜槓,但它似乎幾乎不可能 我已經嘗試了很多東西,但沒有工作的權利..傳遞給UNIX程序窗口路徑中轉義反斜線

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 '[email protected]' ' 
    alias cyg4='cygpath "[email protected]" ' 
    alias cyg5='cygpath "'[email protected]'"' 


    [email protected] ~ 
    $ cyg0 C:\Users\Ted\Music\Enigma 
    C:UsersTedMusicEnigma 

    [email protected] ~ 
    $ cyg1 C:\Users\Ted\Music\Enigma 
    cygpath: can't convert empty path 

    [email protected] ~ 
    $ cyg2 C:\Users\Ted\Music\Enigma 
    cygpath: can't convert empty path 

    [email protected] ~ 
    $ cyg3 C:\Users\Ted\Music\Enigma 
    C:UsersTedMusicEnigma 

    [email protected] ~ 
    $ cyg4 C:\Users\Ted\Music\Enigma 
    C:UsersTedMusicEnigma 

    [email protected] ~ 
    $ cyg5 C:\Users\Ted\Music\Enigma 
    cygpath: can't convert empty path 

順便說一句,我希望能夠輸入C:沒有 引號\用戶\泰德\音樂\謎。其中一個別名在使用引號時有效。

泰德

+0

我有同樣的問題。我想運行「dir/b/s * .txt」來獲取一組文件名,然後將它們傳遞給xargs進行處理,但是Windows dir命令的反斜槓輸出與xargs不能很好地配合。最後,我使用了「find。-name * .txt」,它使用了正斜線。 (我使用xargs並從cygwin包中找到,但是在Windows cmd shell中。) – yoyo

+0

設置'x'選項以準確查看_bash_如何清除您的字符串。只需發出'set -x'。 – bobbogo

回答

7

請閱讀標題爲在bash引述部分(1)(man bash)。

在第一個例子中,

echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo 

殼解釋(然後刪除)雙引號內反斜槓,所以第一個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)是不帶引號的,再次shell解釋和命令之前刪除反斜槓(cyg0cyg1,...)看到過他們。並且...

我希望能夠輸入C:\ Users \ Ted \ Music \ Enigma不帶引號。

對不起,它不能完成。如果不將反斜槓放在單引號中,那麼shell會將其解釋爲隨後字符的引用字符,然後刪除反斜槓。

您有幾種選擇:

  1. 使用命令行上單引號,以保護反斜線:

    cyg4 'C:\Users\Ted\Music\Enigma' 
    
  2. 報價每一個反斜槓字符分開,增加一倍它,例如

    cyg4 C:\\Users\\Ted\\Music\\Enigma 
    
  3. 改用正斜線:

    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 

祝你好運。

+0

有趣的是,問題是我真的想只能在命令行中粘貼Windows路徑。如果我想用斜槓代替反斜槓,我將不得不自己改變它們。無論如何,感謝您的幫助。 – Flethuseo

3

我讀從Windows資源管理器粘貼到命令行的路徑時,也有類似的問題:(ARG帶「-r」)

echo "Please enter path (copy n paste from Win-Explorer):" 
read -r myWinPath; 

「讀-r XYZ」命令不interprete單反斜線在粘貼的路徑中。

myNewCygwinPath=`cygpath -a $myWinPath`; 
echo $myNewCygwinPath; 

維托裏奧

2

有時是非常有用的給使用的程序的手冊試試:-)。從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」爲您做到了!

請注意,對於多於一個arg,您必須零終止參數,例如find ... -print0grep ... --null

+3

在字符串到達​​xargs之前,您的反斜槓將被刪除。 – bobbogo

+0

@bobbogo您的觀察對於原始答案是正確的,但我認爲這只是一個疏忽。使用'-0'的想法是非常有用的(我忘記了這個選項保留了*所有*特殊字符),所以我冒昧地解決了你指出的錯誤,以便使答案更有用,成爲藍圖。 –

1

我有同樣的問題,當使用cygpath轉換文件名如c:\ dirname到unix時,我得到c:dirname,甚至是怪異的東西。

原來,我的問題是我使用的文件名是用戶輸入的,我用「讀取」命令檢索。閱讀,而不是cygpath,通過拋出反斜槓導致我的問題。 「讀-r」解決了這個問題。

1

嘗試:

echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs -0 echo 
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs -0 echo 

xargs的-0選項的解釋(從gnu.org):

「輸入文件名以空字符,而不是由空格終止,任何報價和反斜槓字符不被認爲是特殊的(每個字符都是字面意思)。禁用文件字符串的結尾,這與其他任何參數一樣。「

OR

你也可以用sed實現這一目標:

echo "C:\Users\Ted\Documents\Unix\Scripts" | sed 's/\\/\\\\/g' | xargs echo 
echo 'C:\Users\Ted\Documents\Unix\Scripts' | sed 's/\\/\\\\/g' | xargs echo 

這將取代所有\\\它被傳遞給xargs的面前,其中雙\\後會有剝離回單\,而不是原始的情況下,從單一到無。

sed是一個有用的流編輯器工具,可用於簡單的文本替換。這裏有一個tutorial以及一些很好的例子。

語法取代如下:

s/string_to_replace/replace_with/g

  • g改性劑被用來替換所有發生。沒有它,只有第一場比賽會被取代。
  • sed 's/\\/\\\\/g'的額外反斜槓用於轉義每個\字符的特殊含義。因此,\\將是文字字符\,而\\\\將是\\

對於暫無報價,你將不得不使用\\代替\,作爲標記的答案建議。

echo C:\\Users\\Ted\\Documents\\Unix\\Scripts | xargs echo 
2

我認識到這個答案對派對來說相當晚了......但是我自己偶然發現了同樣的問題,卻偶然發現了這個問題。

我正在使用Cygwin安裝中的'xargs' - 並且 - 我正在從常規的cmd.exe shell中調用它。

對於我來說,我只是用了tr工具,也是在Cygwin的文件夾:

dir /b /s /a *.txt | tr "\\" "/" | xargs ...

這徹底解決了我的「斜線問題」。

相關問題