我正在使用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
自动完成,而是找到一种方法让我的函数来处理它。
答案 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等等)中的空格有任何问题,首先要做的就是变量周围的引号不同。