2012-08-05 67 views
0

我正在考慮爲cygwin編寫一個腳本,將其轉換爲從Windows資源管理器複製的Windows目錄。Shell - 在命令行參數中讀取反斜槓

例如

cdw D:\working\test 

等於

cd /cygdrive/d/working/test 

但似乎對shell腳本,在參數的所有backslashs被忽略,除非使用單引號'D:\working\test'或雙backslashs D:\\working\\test

但在我的情況下,這將是非常不便的,因爲我不能簡單地粘貼目錄名稱在命令行來執行腳本。

有沒有什麼辦法可以使cdw D:\working\test工作?

+2

\是bash中的轉義字符,所以我認爲你運氣不好。 – 2012-08-05 06:16:57

+0

你可以編寫一個shell腳本作爲標準輸入路徑。但是,您必須運行不帶參數的'cdw',然後將路徑粘貼爲輸入。 – PhilMasterG 2012-08-05 06:22:49

+0

一個警告,在'cdw'作爲單獨的腳本運行的情況下,它將作爲單獨的進程運行。雖然'cdw'可能實際上是'chdir'到正確的位置,這不會影響調用它的進程的當前目錄。您需要將'cdw'定義爲一個函數。 – 2012-08-05 09:14:44

回答

4

好了,你可以做到這一點,但你想要的東西奇怪:)

cdw() 
{ 
    set $(history | tail -1) 
    shift 2 
    path="$*" 
    cd $(cygpath "$path") 
} 

使用示例:

$ cdw D:\working\test 
$ pwd 
/cygdrive/d/working/test 

主要的一點是這裏的history使用。 您不直接使用參數,而是以輸入的格式從歷史記錄中獲取參數。

$ rawarg() { set $(history | tail -1); shift 2; echo "[email protected]"; } 
$ rawarg C:\a\b\c\d 
C:\a\b\c\d 

當然,你只能在交互式shell中使用這個技巧(出於顯而易見的原因)。

+0

謝謝,這正是我想要的。使用'歷史記錄'的大提示... – Deqing 2012-08-06 14:57:46

+0

謝謝德清!我很高興幫助你:) – 2012-08-06 14:58:34

+0

它是不安全的,如果文件名包含分號';'例如 – 2012-08-06 15:35:19

0

解決方案添加單引號允許複製粘貼

+0

你可以不用引用就做到這一點;看到我的解決方案 – 2012-08-06 08:47:35

+0

是的,但我不明白需要,而且鍵入單引號更容易 – 2012-08-06 15:41:21

+0

這是德清誰想要這個,我只是提供瞭解決方案 – 2012-08-06 15:43:58

1

你處理的是與外殼的問題。在命令行上添加到cdw的任何參數將在執行cdw之前由外殼進行處理。

爲了防止該處理的事情發生,你需要報價, 被封閉在單引號將整個字符串的任意至少一個級別:

cd 'D:\working\test' 

或雙backslashses:

cd D:\\working\test 

一個單獨的程序不會幫助,因爲破壞在運行之前已經完成。 ;-)

不過,我有一個cdw可能function,這在我的AST UWIN KSH工作:

function cdw { typeset dir 
    read -r dir?"Paste Directory Path: " 
    cd ${dir:?} 
} 

而且在猛砸這一個工程(不支持讀VAR提示):

function cdw { 
    typeset dir 
    printf "Paste Directory Path: " 
    read -r dir || return 
    cd ${dir:?} 
} 

對我來說,我只需輸入圍繞Paste d值的兩個單引號。

+0

你可以不用引用來解決任務,但是,是的,它有點奇怪;使用引號會更正確當然 – 2012-08-06 08:49:16