Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Autocomplete 如何确保将自动完成的空格正确输入函数?_Autocomplete_Scripting_Sh_Zsh - Fatal编程技术网

Autocomplete 如何确保将自动完成的空格正确输入函数?

Autocomplete 如何确保将自动完成的空格正确输入函数?,autocomplete,scripting,sh,zsh,Autocomplete,Scripting,Sh,Zsh,我正在使用并试图编写一个函数来操作URL和路径名: function my-function { somecommand --url $1 $(readlink -f $2) } 让事情稍微复杂一点的是,函数实际上使用了sh语法,因为它源于my~/.zshrc。readlink用于扩展符号链接,并确保目录如。正确计算后,存储目录名以供somecommand稍后使用 当我从命令行键入命令时,如下所示: my-function http://example.org/example /tmp/m

我正在使用并试图编写一个函数来操作URL和路径名:

function my-function
{
  somecommand --url $1 $(readlink -f $2)
}
让事情稍微复杂一点的是,函数实际上使用了sh语法,因为它源于my~/.zshrc。readlink用于扩展符号链接,并确保目录如。正确计算后,存储目录名以供somecommand稍后使用

当我从命令行键入命令时,如下所示:

my-function http://example.org/example /tmp/myexampledirectory
my-function http://example.org/example /tmp/My\ Example\ Directory
。。。它工作正常,即使我自动完成目录名。但是,如果目录名包含空格,则zsh将按如下方式完成:

my-function http://example.org/example /tmp/myexampledirectory
my-function http://example.org/example /tmp/My\ Example\ Directory
对于大多数正常命令,cp、mv等似乎不会引起问题。然而,在我的例子中,somecommand将$2视为仅为/tmp/my,其余部分可能被视为另一个参数


我怎样才能避免这种情况?我不希望改变标准的zsh自动完成,而是希望找到一种方法让我的函数处理这个问题

zsh完成系统在这里工作得非常好,解决方案非常简单,只需在脚本中的readlink参数周围加上双引号:

somecommand --url $1 $(readlink -f "$2")
关键是,如果没有引号,readlink将删除转义空白的反斜杠。比较三个结果:

一,。如果没有反斜杠和引号,readlink-f假定当前目录中有三个不同的文件/目录,它们的默认路径是

$ readlink -f /tmp/My Example Directory
/tmp/My
/home/jimmij/Example
/home/jimmij/Directory
二,。使用转义反斜杠但不带引号的readlink-f可以理解只有一个目录,但会从输出中删除反斜杠,因此somecommand接受三个单独的参数

$ readlink -f /tmp/My\ Example\ Directory
/tmp/My Example Directory
三,。带有反斜杠和双引号的readlink-f给出了somecommand最可能期望的带有反斜杠的输出


顺便说一句,作为经验法则:如果shell脚本bash、zsh中的空格有任何问题,那么首先要处理的就是变量周围的不同引号。

$2不需要被引用,因为默认情况下参数扩展在zsh中不进行分词。但是,命令替换确实如此。somecommand-url$1$readlink-f$2当然,引用$2也不会有什么坏处。顺便说一句,使用引号是理解需要引用的内容和原因的糟糕替代品。3实际上不起作用。如果我从bash readlink-f/tmp/my\dir/with\spaces/执行此操作,我只会得到一个返回码1。不过,正如@chepner所建议的,在整个readlink表达式周围加上空格确实有效。