如何确保我的自动完成空间正确输入我的功能?

时间:2014-09-14 11:58:54

标签: autocomplete scripting sh zsh

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

function my-function
{
  somecommand --url $1 $(readlink -f $2)
}

(为了使事情复杂化,该函数实际上使用sh语法,因为它来自我的〜/ .zshrc使用a trick like this)。 readlink用于扩展符号链接并确保正确评估.等目录(目录名称存储起来以供somecommand稍后使用)。

当我从命令行输入命令时:

my-function http://example.org/example /tmp/myexampledirectory

...它工作正常,即使我自动填充目录名称。但是,如果目录名称包含空格,zsh将完成它,如下所示:

my-function http://example.org/example /tmp/My\ Example\ Directory

对于大多数"正常"命令(cp,mv等)似乎永远不会导致问题。但是,在我的情况下,某些命令将$2视为仅/tmp/My - 可能其余的被视为另一个参数。

我该如何避免这种情况?我希望来改变标准的zsh自动完成,而是找到一种方法让我的函数来处理它。

1 个答案:

答案 0 :(得分:0)

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

somecommand --url $1 $(readlink -f "$2")

重点是没有引号readlink会删除转义空格的反斜杠。比较三个结果:

1。没有反斜杠和引号readlink -f假设有三个不同的文件/目录(当前目录中有默认路径)并生成

$ readlink -f /tmp/My Example Directory
/tmp/My
/home/jimmij/Example
/home/jimmij/Directory

2。使用转义反斜杠但没有引号readlink -f理解只有一个目录,但从输出中删除反斜杠,以便somecommand采用三个单独的参数

$ readlink -f /tmp/My\ Example\ Directory
/tmp/My Example Directory

3。使用反斜杠和双引号readlink -f为输出提供反斜杠somecommand

预期的(最有可能)
$ readlink -f "/tmp/My\ Example\ Directory"
/tmp/My\ Example\ Directory
BTW,根据经验:如果shell类脚本(bash,zsh等等)中的空格有任何问题,首先要做的就是变量周围的引号不同。