2012-08-05 121 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