Shell - 在命令行参数中读取反斜杠

时间:2012-08-05 06:10:20

标签: bash shell command-line

我正在考虑为cygwin编写一个脚本来cd进一个从Windows资源管理器复制的Windows目录。

e.g。

cdw D:\working\test

等于

cd /cygdrive/d/working/test

但是对于shell脚本来说,除非使用单引号'D:\working\test'或双反斜杠D:\\working\\test,否则将忽略参数中的所有反斜杠。

但在我的情况下,这将是非常不方便的,因为我不能简单地在目录名称中粘贴目录名来执行脚本。

有没有办法让cdw D:\working\test正常工作?

3 个答案:

答案 0 :(得分:5)

嗯,你可以做到,但你想要一些奇怪的东西:)

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 "$@"; }
$ rawarg C:\a\b\c\d
C:\a\b\c\d

当然,您只能在交互式shell中使用此技巧(原因很明显)。

答案 1 :(得分:1)

您处理的问题与shell有关。在 cdw执行之前,您将在命令行中添加到cdw的任何参数将由shell 处理。

为了防止发生这种处理,您至少需要一个级别的引用, 将整个字符串用单引号括起来:

cd 'D:\working\test'

或双反斜杠:

cd D:\\working\test

单独的程序无济于事,因为损坏已在运行之前完成。 ; - )

但是,我function可能cdw,它在我的AST UWIN ksh中有效:

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

这个在Bash中工作(不支持read var?提示符):

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

对我来说,我只需在Paste d值附近输入两个单引号。

答案 2 :(得分:0)

添加单引号的解决方案允许复制粘贴