我正在考虑为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
正常工作?
答案 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)
添加单引号的解决方案允许复制粘贴