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

Bash Shell-读取命令行参数中的反斜杠,bash,shell,command-line,Bash,Shell,Command Line,我正在考虑将cygwin的脚本写入一个从windows资源管理器复制的windows目录中 e、 g 等于 cd /cygdrive/d/working/test 但对于shell脚本,除非使用单引号'D:\working\test'或双反斜杠D:\\working\\test,否则参数中的所有反斜杠都将被忽略 但在我的例子中,这将是非常不方便的,因为我不能简单地将目录名粘贴到命令行来执行脚本 有没有办法使cdw D:\working\test工作?添加单引号的解决方案允许复制粘贴添加单引号的

我正在考虑将cygwin的脚本写入一个从windows资源管理器复制的windows目录中

e、 g

等于

cd /cygdrive/d/working/test
但对于shell脚本,除非使用单引号
'D:\working\test'
或双反斜杠
D:\\working\\test
,否则参数中的所有反斜杠都将被忽略

但在我的例子中,这将是非常不方便的,因为我不能简单地将目录名粘贴到命令行来执行脚本


有没有办法使cdw D:\working\test工作?

添加单引号的解决方案允许复制粘贴添加单引号的解决方案允许复制粘贴您处理的问题与shell有关。在命令行上添加到cdw的任何参数都将在执行
cdw
之前由shell处理

为了防止这种情况发生,您至少需要一级报价, 将整个字符串括在单引号中:

cd 'D:\working\test'
或使用双反斜杠:

cd D:\\working\test
单独的程序不会有帮助,因为在运行之前已经造成了损坏。;-)

但是,对于
cdw
,我有一个可能的
函数
,它在我的AST UWIN ksh中工作:

function cdw { typeset dir
    read -r dir?"Paste Directory Path: "
    cd ${dir:?}
}
这一个在Bash中工作(它不支持readvar?prompt):


对我来说,我只是在粘贴d值周围键入两个单引号。

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

为了防止这种情况发生,您至少需要一级报价, 将整个字符串括在单引号中:

cd 'D:\working\test'
或使用双反斜杠:

cd D:\\working\test
单独的程序不会有帮助,因为在运行之前已经造成了损坏。;-)

但是,对于
cdw
,我有一个可能的
函数
,它在我的AST UWIN ksh中工作:

function cdw { typeset dir
    read -r dir?"Paste Directory Path: "
    cd ${dir:?}
}
这一个在Bash中工作(它不支持readvar?prompt):


对我来说,我只需在粘贴的d值周围键入两个单引号。

好吧,你可以这样做,但你需要一些奇怪的东西:)

用法示例:

$ 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中使用此技巧(出于明显的原因)。

您可以这样做,但您需要一些奇怪的东西:)

用法示例:

$ 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中使用此技巧(出于明显的原因)。

\是bash中的转义字符,因此我认为您运气不好。您可以使用stdin的路径编写shell脚本。但是,您必须在不带参数的情况下运行
cdw
,然后将路径粘贴为输入。一个警告是,如果
cdw
作为单独的脚本运行,它将作为单独的进程运行。虽然
cdw
实际上可能
chdir
到正确的位置,但这不会影响调用它的进程的当前目录。您需要将
cdw
定义为用于此目的的函数。@HenkLangeveld谢谢您的提醒。对我来说,我将通过
别名cdw=/home/deqing/scripts/cdw.sh
,所以它仍然可以保存在脚本中。抱歉@deqing,但这行不通。但另一个问题是:如何获取脚本的路径,只需复制/粘贴?\是bash中的转义字符,因此我认为您运气不好。您可以从stdin中获取路径来编写shell脚本。但是,您必须在不带参数的情况下运行
cdw
,然后将路径粘贴为输入。一个警告是,如果
cdw
作为单独的脚本运行,它将作为单独的进程运行。虽然
cdw
实际上可能
chdir
到正确的位置,但这不会影响调用它的进程的当前目录。您需要将
cdw
定义为用于此目的的函数。@HenkLangeveld谢谢您的提醒。对我来说,我将通过
别名cdw=/home/deqing/scripts/cdw.sh
,所以它仍然可以保存在脚本中。抱歉@deqing,但这行不通。但另一个问题是:你将如何获得脚本的路径,只需复制/粘贴?你可以不引用;查看我的解决方案是的,但我不明白需要什么,而且键入单个引号更容易。德清需要这个,我只是提供了解决方案,您可以不引用;看到我的解决方案了吗?是的,但我不明白需要什么,而且键入单个引号更容易。这是德清想要的,我只是提供了解决方案。你可以不用引号解决任务,但是,是的,这有点奇怪;当然,使用引号会更正确。你可以不用引号解决任务,但是,是的,这有点奇怪;当然,如果文件名包含分号“;”,则使用引号更为正确。这是不安全的对于example@NahuelFouilleul:不,它是安全的(或者如果您确定它不是,请提供一个示例),但当然也有一些情况下它工作不正确。这就是为什么我要写:“你想要一些奇怪的东西”@NahuelFouilleul:或者更好的'C:\WINDOWS\;rm-rf/”:)我不明白
cd$(cygpath“$path”)
如何工作。
cd
参数不应该被双引号引用:
cd“$(cygpath“$path”)”
?@IgorChubin:Hmm。。。如果我在我的bash init文件中设置了这个,那么我会得到:
cdw c:\program files
->
/cygdrive/c/program files$
如果我在我的bash init文件中设置了这个,那么我会得到:
cdw c:\program files
->
bash:cd:/cygdrive/c/program:没有这样的文件或目录
如果文件名包含分号';'对于example@NahuelFouilleul:不,它是安全的(或者如果