如何在zsh alias中正确扩展文件名

如何在zsh alias中正确扩展文件名,zsh,Zsh,编写了一个看似简单的别名来将mp3转换为wav,但在运行时不展开文件。在我无法使其工作后,将其更改为函数 我希望得到一个解释,为什么它没有像写的那样工作 别名2wav=表示*.mp3中的fn;执行echo\转换$fn\;avconv-y-i$fn${$basename$fn.mp3}.wav 2>/dev/null;完成 您的文件名是否包含空格?e、 g.foobar.mp3将生成 avconv -y -i foo bar.mp3 foo bar.wav ^^^---i

编写了一个看似简单的别名来将mp3转换为wav,但在运行时不展开文件。在我无法使其工作后,将其更改为函数

我希望得到一个解释,为什么它没有像写的那样工作

别名2wav=表示*.mp3中的fn;执行echo\转换$fn\;avconv-y-i$fn${$basename$fn.mp3}.wav 2>/dev/null;完成


您的文件名是否包含空格?e、 g.foobar.mp3将生成

avconv -y -i foo bar.mp3 foo bar.wav
             ^^^---input file, doesn't exist
                 ^^^^^^^--output file, but since there's no input, it's useless
                         ^^^^^^^^^^--- miscellaneous unknown/invalid arguments
您需要在参数周围加上引号:

alias ........ -y -i "$fn" "${$(basename .....}".wav

至少部分解决了

别名2wav=,表示*.mp3中的fn;进行回声转换${fn};avconv-y-i${fn}${$basename${fn}.mp3}.wav 2>/dev/null;完成

不知道为什么这样做可以解决这个问题,但我用单引号括住了这个命令,并在变量周围添加了大括号,它就这样工作了。确实,文件名中的空格仍然是一个潜在问题。我得试一下。

解决了

别名2wav=,表示*.mp3中的fn;进行回声转换${fn};avconv-y-i${fn}${$basename${fn}.mp3}.wav 2>/dev/null;完成

现在适用于包含空格的文件名。我猜单引号会阻止扩展在运行时之前发生,这就是为什么它会起作用

欢迎任何澄清